Ignorar errores de mecanografía "la propiedad no existe en el valor de tipo"


228

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

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

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

Respuestas:


304

Sé que la pregunta ya está cerrada, pero la encontré buscando la misma excepción TypeScriptException, tal vez alguien más respondió a esta pregunta buscando este problema.

El problema radica en la falta de escritura de TypeScript:

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

Arroja 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, finales de 2016

Dado que el operador de conversión preferido de TypeScript 1.6 es asesas líneas se pueden dividir en elegantes:

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


Otras soluciones

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

  1. Crear una interfaz propia que simplemente se extienda HTMLElement
  2. Introducir su propia escritura que se extiende HTMLElement

14
También podría crear una interfaz que se extienda HTMLElementy tenga la getBBoxpropiedad adicional . De esa manera, aún se completa el código en las otras propiedades.
thetallweeks

en lugar de lanzar a cualquiera, getBBox¿hay algún método para lanzarlo? le gustaría saber el tipo de getBBox?
Pardeep Jain

FE: Si getBBoxestuviera en HTMLElementtipo, podría lanzarle el objeto var typedElement = <HTMLElement> outerHtmlElement;.
michalczukm

44
¡bonito! var coordinates = (<any>outerElement[0]).getBBox();
Bowpunya

1
En realidad, esto no responde a la pregunta: "Cómo ignorar los errores"
Petr Peller

123

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

(y as any).x

La "ventaja" es que, siendo el elenco explícito, esto se compilará incluso con el noImplicitAnyconjunto de banderas.

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

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


Dado que estoy en modo de descargo de responsabilidad, la transmisión doble a través de anyuna nueva interfaz puede ser útil en situaciones en las que

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

aún así, todavía quieres algún tipo de escritura.

Supongamos que desea parchear la definición de una instancia yde tipo OrginalDefcon una nueva propiedad xde tipo number:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //will compile

gracias esto ayudó: import http = require ('http'); servidor var = http como cualquiera; server.Server (aplicación); // ignora los errores ts!
escape

Utilicé esto en "asegurar propiedad no encontrada en NodeRequire". así que declaró mi variable require en NodeRequired y (require como cualquier) .ensure para la propiedad. Espero que esto ayude.
Juni Brosas

61

También puedes usar el siguiente truco:

y.x = "some custom property"//gives typescript error

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

Tenga en cuenta que para acceder xy no obtener un error de mecanografía nuevamente, debe escribirlo así y["x"], no y.x. Desde esta perspectiva, las otras opciones son mejores.


44
¿Alguien sabe por qué esto funciona, y si esto tiene posibles ramificaciones o beneficios sobre declarar inicialmente el objeto como :any?
mcheah

Tendría el claro beneficio de mantener los mecanografiados, en lugar de lanzarlos a ninguno. Me gustaría saber por qué esto no arroja una advertencia, pero el acceso directamente sí ..
Powderham

38

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 real (gran repositorio aquí ) 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 tipos, intente lo siguiente:

declare var y;

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


55
Debería estar /// <reference path="/path/to/jquery.d.ts" />con la etiqueta de cierre automático al final
tic

Estoy usando VS2015 y seguí este tutorial para angular, no tengo jquery.d.tsarchivo en mi proyecto
Dimple

@Dimple npm install -g tsdentoncestsd install jquery
Akash

La segunda opción (declarar var y) funciona muy bien si está migrando de JavaScript a TypeScript, y desea evitar el error TS2304 porque su antiguo JavaScript hace referencia a una variable en otro archivo JavaScript.
yesman

¡Gracias! Para mí, el problema era con Jest, const mockPrompt: any = jest.spyOn (paso, 'prompt');
Mark Robson

18

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

Teoría

(<any>y).x;

Ejemplo del mundo real

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

let name: string = this.constructor.name;

Entonces lo arreglé con:

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

1
No funciona con super. Si amplías una clase usando tipings y el autor olvida un método público, estás bastante jodido. Debe agregarlo a la definición de tipo, que se detiene en la próxima instalación de npm, lo que le obliga a crear una solicitud de extracción o notificar al autor, lo que probablemente sea algo bueno pero doloroso.
Corey Alix

15

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

Soluciones:

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

Como arreglarlo:

localStorage ['ciudad']

(localStorage) .city

(localStorage como cualquiera) .city


La segunda opción parece genial, pero ya no parece hacer el trabajo. Funciona si prefijas un objeto con <any>- (<any>localStorage).city.
jayarjo

Sé que esto es viejo, pero tu ejemplo principal me funcionó ... Bien hecho.
MacD

4

Una solución rápida donde nada más 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

No es una buena práctica, pero proporciona una solución sin necesidad de desactivar el literal sin cadenas


También hago esto, pero algunas plataformas (como Google Cloud) generarán un mensaje de advertencia que sugiere que ab es mejor que una ['b']. ¿Sabes por qué es esto?
Jonathan

1
No estoy seguro, pero puede, en tslint.json, por ejemplo, cambiar las opciones para que prefiera ab
danday74

3

Sé que ahora es 2020, pero no pude ver una respuesta que satisficiera la parte de "ignorar" de la pregunta. Resulta que puedes decirle a TSLint que haga eso usando una directiva;

// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);

Normalmente esto arrojaría un error, indicando que 'someProp no existe en el tipo'. Con el comentario, ese error desaparece.

Esto detendrá cualquier error que se genere al compilar y también debería evitar que su IDE se queje de usted.


0

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


0

Pude superar esto en 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.