Att implementera ett Typescript-klassgränssnitt bevarar inte metodyper
Jag försöker skriva ett Typescript-interface och sedan skriva en klass som implementerar det interfacet.
Problemet är att jag inte verkar kunna få metodsignaturerna från gränssnittet att gälla för klassen.
Här är ett nedbantat exempel:
export interface Foo {
bar(value: string): void;
}
export class MyFoo implements Foo {
// ✔️ Typescript error:
// Property 'bar' is missing in type 'MyFoo' but required in type 'Foo'
}
export class MyFoo implements Foo {
// value is inferred as `any` instead of `string`,
// and there aren't any errors with the return type mismatch
bar(value) { return true; }
}
Det verkar som om kompilatorn är medveten om att bar-metoden bör finnas, men av någon anledning bevarar den inte dess signatur.
Svar #1
Det verkar som att kompilatorn är medveten om att bar-metoden borde finnas, men av någon anledning bevaras inte dess signatur.
Korrekt. Skälen tas upp här: https://github.com/Microsoft/TypeScript/pull/6118#issuecomment-216595207
Så det blir utvecklarens ansvar att lägga till de annoteringar de behöver.
Svar #2
Typen any kan tilldelas vilken annan typ som helst i TypeScript. Du bör specificera typen för value i implementeringen av bar-metoden. Då, om det är något annat än string, kommer kompilatorn att ge ett fel.
Du kan tvinga din TypeScript-kompilator att inte tillåta någon implicit any genom att lägga till följande rad i din tsconfig.json-fil.
"noImplicitAny": true
I allmänhet är bästa praxis att uttryckligen lägga till typen för funktionsparametrar och returvärden och undvika any så mycket som möjligt.
