【发布时间】:2018-08-09 22:40:45
【问题描述】:
我在 TypeScript 中偶然发现了一个奇怪的情况,代码如下:
function staticImplements<T>() {
return (constructor: T) => {};
}
enum FruitList {
APPLE,
BANANA,
PEAR,
}
interface FruitInterface {
fruit: FruitList;
}
abstract class Fruit implements FruitInterface {
fruit: FruitList;
constructor(fruit: FruitList) {
this.fruit = fruit;
}
}
interface AppleConstructor {
new(fruit: FruitList.APPLE): AppleInterface;
}
interface AppleInterface extends Fruit {
fruit: FruitList.APPLE;
}
class Apple extends Fruit implements AppleInterface {
fruit: FruitList.APPLE;
constructor(fruit: FruitList) {
super(fruit);
}
}
staticImplements<AppleConstructor>()(Apple);
如您所见,Fruit 的构造函数需要FruitList 类型的参数fruit,子类Apple 的构造函数也是如此,但是AppleInterface 的字段fruit 只需要枚举FruitList 的值APPLE,而不是枚举与其父FruitInterface 一样拥有的所有可能值。 AppleConstructor 也是如此,它期望参数fruit 的类型为FruitList.APPLE,用于检查Apple 静态是否实现了最后一行带有函数staticImplements 的接口。问题是,TypeScript 声明它有但它没有,这怎么可能?
【问题讨论】:
标签: typescript oop generics constructor