javascript - Bästa sättet att lösa typescript-fel - egenskapen finns inte på typen
Jag har flera olika situationer där jag försöker definiera en egen egenskap på en array eller ett objekt i TypeScript men får ofta felet:
"Egenskapen x finns inte på typen Object (eller typen Array)"
Till exempel använder jag TypeScript i Angular och har ett definierat omfång baserat på Angulars typdefinitionsfil:
scope:ng.IScope
Men sedan när jag försöker skapa en ny egendom på scope genom att göra:
scope.anotherProperty = "string";
Jag får felet som nämns ovan. Jag vet att jag kan lösa det genom att göra en av följande:
scope["anotherProperty"] = "string";
ELLER
(<any>scope).anotherProperty = "string;
Ett annat exempel är när jag har något liknande detta i mitt d3-diagram:
function panZoomNode (node:any) {
for (var i = 0; i < renderedNodes.length; i++) {
if (node.id === renderedNodes[i].id) {
}
}
}
Idealiskt skulle jag vilja ändra den där (node:any)-parametern till något som:
(node:Object)
Men när jag gör det får jag ett fel som säger "property id does not exist on type Object". Jag vet att jag kan rätta det med de lösningar jag nämnde ovan men det verkar lite slarvigt för mig. Finns det ett bättre sätt eller bästa TypeScript-sätt att få dem att fungera korrekt för både arrayer och objekt?
Tack
Svar #1
Du kan lägga till den extra egenskapen till ng.IScope-gränssnittet genom att lägga till följande i din kod:
interface ng.IScope {
anotherProperty?:string;
}
Detta skulle låta dig ringa
scope.anotherProperty = "string";
Utan att se resten av din kod och veta vad node faktiskt representerar kan jag bara säga att för att göra kompilatorn nöjd behöver du bara inkludera de medlemmar du hänvisar till i din TS-kod. Om du gjorde det på rätt sätt skulle du skapa en klass som innehåller alla medlemmar. Om den härstammar från en befintlig klass eller implementerar ett befintligt gränssnitt bör du ärva från dessa i din klassdefinition.
Redigera: Om du inte redan har gjort det bör du titta i DefinitelyTyped GitHub-repot för D3-definitionerna. Förutsatt att node är en D3-typ, kan du använda det för att lösa ditt problem och undvika att skriva din egen klass.
