Varför kastar inte TypeScript något fel när ett gränssnitt inte implementeras korrekt?
Jag har en klass som implementerar gränssnittet. Om en klass inte inkluderar metoden som gränssnittet kräver, kastar inte Typescript-kompilatorn ett fel utan kör felet.
Jag vill tvinga kompilatorn att kasta ett fel om felet saknas.
interface PersonInterface {
name: string;
age: number;
}
class Person implements PersonInterface {
name: string = 'Mary';
foo: any = 'abc';
}
alert(new Person().name)
Du kan kolla koden här på lekplatsen https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=10&pc=31#code/JYOwLgpgTgZghgYwgAgArQM4HsQElzTxLIDeAsAFDLIhwC2EAXMhmFKAOYDc1l1cHJjQCudAEbQeySgF9KCADZwMGNJhzJgdAA4KIDcKvRRseArEQoS1XlRr0hrdiA7IAvMgDkAWThQAnp5SfMgwWFjMcCD+7l5wYghBspTyONh6AHQKWBwAFCAQAO5qJji5AJQZtAzlQA
Codesandbox LÄNK : https://codesandbox.io/s/typescript-3bqq4?file=/src/index.ts
Svar #1
Koden i lekplatsen ger fel på age-egenskapen och så här kan du skriva en metod.
- Skriver en metod
interface PersonInterface {
name: string;
age: number;
// type a method
sayHello(): string
// type function property
repeat: (sentence: string) => string
}
class Person implements PersonInterface {
name: string = 'Mary';
foo: any = 'abc';
sayHello() {
return `Hello my name is ${this.name}`
}
repeat = (input) => {
return `${input}`
}
}
Om du vill att det ska ge ett fel bör du överväga att använda en abstrakt klass. En sak att notera är att du inte kan instansiera en abstrakt klass. Dokumentation
abstract class PERSON {
abstract name: string;
abstract age: number;
abstract repeat(sentence: string): string;
}
class Person extends PERSON{
//
// Will error out for not implementing
// properties and methods
//
}
Fel kommer att försvinna
class Person extends PERSON {
constructor(public name: string, public age: number) {
super();
}
repeat(input: string) {
return `${input}`;
}
}
