official documenting con app javascript typescript visual-studio-2013

javascript - documenting - Ignorar errores de mecanografía "la propiedad no existe en el valor del tipo"



typescript con html (8)

En el edificio VS2013 se detiene cuando tsc sale con el código 1. Este no fue el caso en VS2012.

¿Cómo puedo ejecutar mi solución ignorando el error tsc.exe?

Obtengo muchos The property ''x'' does not exist on value of type ''y'' errores The property ''x'' does not exist on value of type ''y'' que quiero ignorar cuando uso las funciones de JavaScript.


Cuando TypeScript cree que la propiedad "x" no existe en "y" , entonces siempre puede convertir "y" en "any", lo que le permitirá llamar cualquier cosa (como "x") en "y".

Teoría

(<any>y).x;

Ejemplo de mundo real

Obtuve el error "TS2339: la propiedad ''nombre'' no existe en el tipo ''Función''" para este código:

let name: string = this.constructor.name;

Así que lo arreglé con:

let name: string = (<any>this).constructor.name;


En mi proyecto particular no pude hacer que funcionara, y usé declare var $; . No es una solución limpia / recomendada, no reconoce las variables de JQuery, pero no tuve errores después de usar eso (y tuve que hacerlo para que mis compilaciones automáticas tuvieran éxito).


Hay varias formas de manejar este problema. Si este objeto está relacionado con alguna biblioteca externa, la mejor solución sería encontrar el archivo de definiciones actual (gran repositorio here ) para esa biblioteca y hacer referencia a ella, por ejemplo:

/// <reference path="/path/to/jquery.d.ts" >

Por supuesto, esto no se aplica en muchos casos.

Si desea ''anular'' el sistema de tipo, intente lo siguiente:

declare var y;

Esto le permitirá hacer las llamadas que desee en var y .


La solución rápida y sucia es emitir explícitamente a any

(y as any).x

La "ventaja" es que, como el reparto es explícito, se compilará incluso con el noImplicitAny banderas noImplicitAny .

La solución adecuada es actualizar el archivo de definición de typings.

Tenga en cuenta que, cuando envía una variable a any , opta por no verificar el tipo de esa variable.

Como estoy en modo de exención de responsabilidad, el doble casting combinado con una nueva interfaz puede ser útil en situaciones en las que

  • no quiero actualizar un archivo roto de typings
  • son parches de mono

sin embargo, todavía quieres algún tipo de tipeo.

Digamos que quiere parchar la definición de una instancia de y de tipo OrginalDef con una nueva propiedad x de tipo number :

const y: OriginalDef = ... interface DefWithNewProperties extends OriginalDef { x: number } const patched = y as any as DefWithNewProperties patched.x = .... //will compile


Pude pasar esto en texto mecanografiado 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); }

Esta parecía ser la única forma en que podía usar los valores dentro de X como claves para el mapa Y y compilar.


Sé que la pregunta ya está cerrada pero lo he encontrado buscando la misma TypeScriptException, tal vez alguien más haya llegado a esta pregunta buscando este problema.

El problema radica en la falta de tipeo de TypeScript:

var coordinates = outerElement[0].getBBox();

Lanzamientos The property ''getBBox'' does not exist on value of type ''HTMLElement''.


La forma más fácil es escribir explícitamente la variable como any

var outerHtmlElement: any = outerElement[0]; var coordinates = outerHtmlElement.getBBox();

Editar, a fines de 2016

Como el operador de casting preferido de TypeScript 1.6 es as esas líneas se pueden convertir en elegantes:

let coordinates = (outerElement[0] as any).getBBox();

Otras soluciones

Por supuesto, si desea hacerlo bien, lo cual es una exageración a veces, puede:

  1. Crea una interfaz propia que simplemente extiende HTMLElement
  2. Introduzca su propio tipeo que extiende HTMLElement

También puedes usar el siguiente truco:

yx = "some custom property"//gives typescript error

y["x"] = "some custom property"//no errors

Tenga en cuenta que para acceder a x y no obtener un error de mecanografiado de nuevo, debe escribirlo así y["x"] , no yx . Entonces, desde esta perspectiva, las otras opciones son mejores.


Tuve un problema en Angular2, estaba usando el almacenamiento local para guardar algo y no me lo permitía.

Soluciones:

Tenía localStorage.city -> error -> Property ''city'' does not exist on type ''Storage''.

Como arreglarlo:

localStorage [''city'']

(localStorage) .city

(localStorage como cualquier) .city