在使用ts时,我看到有这样的语法,但是没明白这样定义的好处以及为什么这样定义?
function create<T>(c: {new(): T; }): T {
return new c();
}
class BeeKeeper {
hasMask: boolean;
}
class ZooKeeper {
nametag: string;
}
class Animal {
numLegs: number;
}
class Bee extends Animal {
keeper: BeeKeeper;
}
class Lion extends Animal {
keeper: ZooKeeper;
}
function createInstance<A extends Animal>(c: new () => A): A {
return new c();
}
createInstance(Lion).keeper.nametag; // typechecks!
createInstance(Bee).keeper.hasMask; // typechecks!
看handbook也遇到同样的问题了,不了解ts的语法根本看不懂。
官网的handbook只有例子没有详细的定义,官网也没有spec的链接,差评。
TypeScript Language Specification
https://github.com/Microsoft/...
c:{new():T}里的'new'是Constructor Type Literal,下面new c()里的'new'是new operator,二者是不同的东西。
c:{new():T} 和 c:new()=>T是一样的,后者是前者的简写,意即C的类型是对象类型且这个对象包含返回类型是T的构造函数。
注意,':'后面是Type Information,这里的'=>'不是arrow function,只是用来标明函数返回类型。