如何将一个Typescript接口实现为es5风格的"类"?

Seu*_*uga 3 javascript typescript dependency-inversion

我们可以实现一个接口到es6类的方式非常简单:

interface IDog {
    bark(): void
}

class Dog implements IDog {
    bark(): void {

    }
}
Run Code Online (Sandbox Code Playgroud)

问题是:如何为这个"类"实现相同的接口:

const Dog = function() {

}

Dog.prototype.bark = function() {

}
Run Code Online (Sandbox Code Playgroud)

我尝试将狗的类型定义为IDog : const Dog: IDog. 没工作.

所以,我需要它来实现依赖倒置,我无法弄清楚如何使用es5类来做到这一点.我看到经典继承风格是Javascript中的"反模式",所以我决定以旧方式创建类,并需要帮助实现Typescript接口.

art*_*tem 6

我假设您需要es5样式的类实现,它被声明为符合IDog接口,并由编译器进行类型检查以确保它真正符合该接口.

坏消息 - TypeScript不支持.您可以让TypeScript认为es5 Dog是一个实现的类IDog,但您必须声明DogConstructor接口并使用as any as DogConstructor类型断言Dog.并且您无法使TypeScript成为基于原型的实现,因为Object.prototype(以及随后Dog.prototype)any在系统库中声明(请参阅以下 问题进行讨论):

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();
Run Code Online (Sandbox Code Playgroud)

我认为对此的支持不会得到改善.Es5风格的类通常用javascript代码实现,这并不意味着要进行类型检查,TypeScript为编写类型声明提供了足够的支持,允许以类型安全的方式使用javascript实现.如果要在TypeScript中实现类,则可以简单地使用实际类.