我们可以为es6类实现接口的方法非常简单:
interface IDog {
bark(): void
}
class Dog implements IDog {
bark(): void {
}
}
问题是:如何为该“类”实现相同的接口:
const Dog = function() {
}
Dog.prototype.bark = function() {
}
我尝试将Dog的类型定义为IDog:const Dog: IDog
。没用。
所以,我需要它来实现依赖倒置,而我不知道如何使用es5类来实现。我看到古典继承样式是Javascript中的“反模式”,因此我决定以旧的方式创建类,并且需要帮助为它们实现Typescript接口。
答案 0 :(得分:5)
我假设您要使用es5样式的类实现,该类声明为符合IDog
接口,并由编译器进行类型检查以确保其确实符合该接口。
坏消息-TypeScript不支持。您可以使TypeScript认为es5 Dog
是实现IDog
的类,但是您必须声明DogConstructor
接口并对as any as DogConstructor
使用Dog
类型声明。而且您无法使TypeScript对基于原型的实现进行类型检查,因为Object.prototype
(随后是Dog.prototype
)在系统库中被声明为any
(请参见these {{3 }}进行讨论)
interface IDog {
bark(): void
}
interface DogConstructor {
new(): IDog;
}
const Dog = function (this: IDog) {
// this.bark(); you can do this because of `this: IDog` annotation
} as any as DogConstructor;
Dog.prototype.bark = function() {
}
const p = new Dog();
p.bark();
我认为对此的支持不会得到改善。 Es5样式类通常以javascript代码实现,而不是进行类型检查,而TypeScript为编写允许使用类型安全方式使用javascript实现的类型声明提供了足够的支持。如果要在TypeScript中实现类,则可以简单地使用实际类。
答案 1 :(得分:2)
对此没有语言支持,如果这是很常见的事情,我们能做的最好的事情就是推出我们自己的类创建函数,该函数对我们添加到该类的成员施加了限制。
使用fa fa-star
编译器选项和noImplicitThis
,我们也可以对类成员进行很好的类型检查,虽然没有像确定字段分配这样的花哨的东西,但它足够好:
ThisType
注意:以上实现类似于答案here,您可以在此处阅读更深入的说明。