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, as
essas 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:
HTMLElement
HTMLElement
getBBox
usar qualquer um, existe algum método para usar propriamente? gostaria de descobrir o tipo de getBBox
?
getBBox
fosse do HTMLElement
tipo, 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 noImplicitAny
sinalizador 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 any
combinada 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 y
do tipo OrginalDef
com uma nova propriedade x
do 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 x
e 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 tsd
thentsd 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.
HTMLElement
e tenha agetBBox
propriedade adicional . Dessa forma, você ainda obtém a conclusão do código nas outras propriedades.