tl; dr :我想以一种很好的方式扩展3rd-party lib的类。但是如何?
假设我有一个第三方方库,它创建了非常通用的实体Animal
:
class Animal {
type: string;
}
我要创建一个cat
和一个dog
:
const dog = new Animal({type: 'dog'});
const cat = new Animal({type: 'cat'});
但是无论如何,它们的类型都会是Animal
。将来,我希望有只接受Cat
而不接受Dog
的函数。
我唯一想到的想法是创建函数,例如:
function createCat(): Cat {
return new Animal({type: 'cat'}) as Cat;
}
class Cat extends Animal {}
但是这种方法有很多缺点:
return ... as Cat
)。我想要看到的东西是这样的:
function createCat(): Animal<Cat> {
return ...;
}
有可能吗?还是任何其他方法?
谢谢。
答案 0 :(得分:1)
a)不确定您的所有“缺点”本身就是如此可怕的缺点。
b)看一下页面底部的示例:
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!
https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Generics.md