Javascript 如何在typescript中以通用方式扩展第三方类?
tl;dr:我想以一种好的方式扩展第三方库的类。但是怎么做呢 假设我有一个第三方库,它创建了非常通用的实体Javascript 如何在typescript中以通用方式扩展第三方类?,javascript,typescript,es6-class,typescript-generics,Javascript,Typescript,Es6 Class,Typescript Generics,tl;dr:我想以一种好的方式扩展第三方库的类。但是怎么做呢 假设我有一个第三方库,它创建了非常通用的实体动物: class Animal { type: string; } 我想创建一只猫和一只狗: const dog = new Animal({type: 'dog'}); const cat = new Animal({type: 'cat'}); 但是就类型而言,它们都是动物。将来我希望函数只接受Cat,而不接受Dog 我唯一想到的是创建函数,如: function create
动物:
class Animal {
type: string;
}
我想创建一只猫
和一只狗
:
const dog = new Animal({type: 'dog'});
const cat = new Animal({type: 'cat'});
但是就类型而言,它们都是动物
。将来我希望函数只接受Cat
,而不接受Dog
我唯一想到的是创建函数,如:
function createCat(): Cat {
return new Animal({type: 'cat'}) as Cat;
}
class Cat extends Animal {}
但这种方法有许多缺点:
- 我将在运行时有额外的类李>
- 我必须手动描述每个类(猫、狗)李>
- 我必须在每个“创建”函数中强制转换类型(
返回…作为Cat
)李>
我想看到的是类似于:
function createCat(): Animal<Cat> {
return ...;
}
函数createCat():动物{
回来
}
可能吗?或者有什么不同的方法
谢谢。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!
class养蜂人{
hassmask:布尔型;
}
动物园管理员{
nametag:string;
}
类动物{
numLegs:数字;
}
蜂类动物{
养蜂人:养蜂人;
}
狮子类动物{
饲养员:动物园饲养员;
}
函数createInstance这对我不起作用:在我的情况下-我不想扩展结构,区别只会在数据中。因此,就类型脚本而言,猫
,狗
,和动物
将是相同的类型,因此您将无法编写接受猫
但不接受狗
的函数。然后,使其相同,它不必有不同的字段。