Negeer typescript-fouten “eigenschap bestaat niet op waarde van type”

In VS2013 stopt het bouwen wanneer tsc afsluit met code 1. Dit was niet het geval in VS2012.

Hoe kan ik mijn oplossing uitvoeren terwijl ik de tsc.exe-fout negeer?

Ik krijg veel The property 'x' does not exist on value of type 'y'fouten, die ik wil negeren bij het gebruik van javascript-functies.


Antwoord 1, autoriteit 100%

Ik weet dat de vraag al gesloten is, maar ik heb gevonden dat hij op zoek was naar dezelfde TypeScriptException, misschien heeft iemand anders deze vraag beantwoord op zoek naar dit probleem.

Het probleem ligt in het ontbreken van TypeScript-typen:

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

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

De eenvoudigste manier is om variabele expliciet te typen als `any`

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

Bewerken, eind 2016

Sinds TypeScript 1.6 is de cast-operator die de voorkeur heeft as, dus die regels kunnen worden geplet in:

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


Andere oplossingen

Als je het goed wilt doen, wat soms een overkill is, kun je natuurlijk:

  1. Maak een eigen interface die eenvoudig HTMLElement
  2. uitbreidt

  3. Introduceer eigen typen die HTMLElement
  4. uitbreidt


Antwoord 2, autoriteit 45%

De snelle en vuile oplossing is om expliciet te casten naar any

(y as any).x

Het “voordeel” is dat, aangezien de cast expliciet is, deze zelfs wordt gecompileerd als de vlag noImplicitAnyis ingesteld.

De juiste oplossing is om het typedefinitiebestand bij te werken.

Houd er rekening mee dat, wanneer u een variabele cast naar any, u zich afmeldtvoor typecontrole voor die variabele.


Aangezien ik in de disclaimermodus zit, kan dubbel casten via anyin combinatie met een nieuwe interface handig zijn in situaties waarin

  • je wilt een gebroken typbestand niet bijwerken
  • en/of je bent een aap aan het patchen

toch wil je nog steeds een of andere vorm van typen.

Stel dat u de definitie van een instantie van yvan het type OrginalDefwilt patchen met een nieuwe eigenschap xvan het type number:

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

Antwoord 3, autoriteit 21%

Je kunt ook de volgende truc gebruiken:

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

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

Let op, om toegang te krijgen tot xen niet opnieuw een typescript-fout te krijgen, moet je het zo schrijven y["x"], niet y.x. Dus vanuit dit perspectief zijn de andere opties beter.


Antwoord 4, autoriteit 11%

Er zijn verschillende manieren om dit probleem op te lossen. Als dit object gerelateerd is aan een externe bibliotheek, zou de beste oplossing zijn om het daadwerkelijke definitiebestand te vinden (geweldige repository hier) voor die bibliotheek en verwijs ernaar, bijvoorbeeld:

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

Natuurlijk is dit in veel gevallen niet van toepassing.

Als je het typesysteem wilt ‘overschrijven’, probeer dan het volgende:

declare var y;

Hiermee kun je alle oproepen doen die je wilt op var y.


Antwoord 5, autoriteit 6%

Als TypeScript denkt dat eigenschap “x”niet bestaat op “y”, dan kun je altijd “y” casten in “any”, waarmee je om iets (zoals “x”) op “y” te roepen.

Theorie

(<any>y).x;

Voorbeeld uit de echte wereld

Ik kreeg de foutmelding “TS2339: Eigenschap ‘naam’ bestaat niet op type ‘Functie'” voor deze code:

let name: string = this.constructor.name;

Dus ik heb het opgelost met:

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

Antwoord 6, autoriteit 5%

Ik had een probleem in Angular2, ik gebruikte de lokale opslag om iets op te slaan en ik kon het niet.

Oplossingen:

Ik had localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

Hoe dit op te lossen:

localStorage[‘city’]

(localStorage).city

(localStorage as any).city


Antwoord 7, autoriteit 5%

Ik weet dat het nu 2020 is, maar ik zag geen antwoord dat beantwoordde aan het gedeelte ‘negeren’ van de vraag. Blijkt dat je TSlint kunt vertellen om precies dat te doen met behulp van een richtlijn;

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

Normaal gesproken zou dit een foutmelding geven, waarin staat dat ‘someProp niet bestaat op type’. Met de opmerking verdwijnt die fout.

Dit voorkomt dat er fouten worden gegenereerd tijdens het compileren en zou ook moeten voorkomen dat uw IDE over u klaagt.


Antwoord 8, autoriteit 2%

Een snelle oplossing waar niets anders werkt:

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

Geen goede gewoonte, maar biedt een oplossing zonder letterlijke tekst uit te schakelen


Antwoord 9

In mijn specifieke project kreeg ik het niet werkend en gebruikte ik declare var $;. Geen schone/aanbevolen oplossing,het herkent de JQuery-variabelen niet, maar ik had geen fouten nadat ik dat had gebruikt (en moest wel om mijn automatische builds te laten slagen).


Antwoord 10

Ik kon hier in typoscript overheen komen met zoiets als:

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);
}

Dit leek de enige manier te zijn waarop ik de waarden binnen X kon gebruiken als sleutels voor de kaart Y en compileren.

Other episodes