如何实现ES5样式“类”的Typescript接口?

时间:2018-07-09 00:50:07

标签: javascript typescript dependency-inversion

我们可以为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接口。

2 个答案:

答案 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,您可以在此处阅读更深入的说明。