Respostas:
Eu sei que a pergunta já está fechada, mas eu a encontrei procurando pela mesma TypeScriptException, talvez alguém mais tenha encontrado essa pergunta procurando esse problema.
O problema está na falta da digitação do TypeScript:
var coordinates = outerElement[0].getBBox();
Arremessos The property 'getBBox' does not exist on value of type 'HTMLElement'.
A maneira mais fácil é digitar explicitamente variável como any
var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();
Como o operador de conversão preferido do TypeScript 1.6, asessas linhas podem ser compactadas com elegância:
let coordinates = (outerElement[0] as any).getBBox();
Obviamente, se você quiser fazer o certo, que às vezes é um exagero, você pode:
HTMLElementHTMLElementgetBBoxusar qualquer um, existe algum método para usar propriamente? gostaria de descobrir o tipo de getBBox?
getBBoxfosse do HTMLElementtipo, você poderia converter o objeto nele var typedElement = <HTMLElement> outerHtmlElement;.
var coordinates = (<any>outerElement[0]).getBBox();
A solução rápida e suja é lançar explicitamente para any
(y as any).x
A "vantagem" é que, sendo o elenco explícito, isso será compilado mesmo com o noImplicitAnysinalizador definido.
A solução adequada é atualizar o arquivo de definição de digitações.
Observe que, ao converter uma variável para any, você desativa a verificação de tipo para essa variável.
Como estou no modo de isenção de responsabilidade, a transmissão dupla via anycombinada com uma nova interface pode ser útil em situações nas quais você
ainda assim, você ainda deseja alguma forma de digitação.
Digamos que você queira corrigir a definição de uma instância ydo tipo OrginalDefcom uma nova propriedade xdo tipo number:
const y: OriginalDef = ...
interface DefWithNewProperties extends OriginalDef {
x: number
}
const patched = y as any as DefWithNewProperties
patched.x = .... //will compile
Você também pode usar o seguinte truque:
y.x = "some custom property"//gives typescript error
y["x"] = "some custom property"//no errors
Observe que, para acessar xe não receber um erro de texto novamente, você precisa escrevê-lo assim y["x"], não y.x. Portanto, dessa perspectiva, as outras opções são melhores.
:any?
Existem várias maneiras de lidar com esse problema. Se esse objeto estiver relacionado a alguma biblioteca externa, a melhor solução seria encontrar o arquivo de definições real (ótimo repositório aqui ) para essa biblioteca e referenciá-lo, por exemplo:
/// <reference path="/path/to/jquery.d.ts" >
Obviamente, isso não se aplica em muitos casos.
Se você deseja 'substituir' o sistema de tipos, tente o seguinte:
declare var y;
Isso permitirá que você faça as chamadas que desejar var y.
/// <reference path="/path/to/jquery.d.ts" />com a tag de fechamento automático no final
npm install -g tsdthentsd install jquery
Quando o TypeScript pensa que a propriedade "x" não existe em "y" , você sempre pode converter "y" em "any", o que permitirá chamar qualquer coisa (como "x") em "y".
Teoria
(<any>y).x;
Exemplo do mundo real
Eu estava recebendo o erro "TS2339: a propriedade 'name' não existe no tipo 'Function'" para este código:
let name: string = this.constructor.name;
Então eu o corrigi com:
let name: string = (<any>this).constructor.name;
Tive um problema no Angular2, eu estava usando o armazenamento local para salvar algo e isso não me permitiu.
Soluções:
eu tinha localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.
Como corrigi-lo:
localStorage ['cidade']
(localStorage) .city
(localStorage como qualquer) .city
<any>- (<any>localStorage).city.
Uma solução rápida onde nada mais funciona:
const a.b = 5 // error
const a['b'] = 5 // error if ts-lint rule no-string-literal is enabled
const B = 'b'
const a[B] = 5 // always works
Não é uma boa prática, mas fornece uma solução sem a necessidade de desativar no-string-literal
Sei que agora é 2020, mas não consegui ver uma resposta que satisfizesse a parte "ignorar" da pergunta. Acontece que você pode dizer ao TSLint para fazer exatamente isso usando uma diretiva;
// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);
Normalmente, isso geraria um erro, afirmando que 'someProp não existe no tipo'. Com o comentário, esse erro desaparece.
Isso interromperá a ocorrência de erros ao compilar e também interromperá a reclamação do IDE.
Consegui superar isso em texto datilografado usando algo como:
let x = [ //data inside array ];
let y = new Map<any, any>();
for (var i=0; i<x.length; i++) {
y.set(x[i], //value for this key here);
}
Essa parecia ser a única maneira de eu usar os valores dentro de X como chaves para o mapa Y e compilar.
HTMLElemente tenha agetBBoxpropriedade adicional . Dessa forma, você ainda obtém a conclusão do código nas outras propriedades.