Javascript 如何在typescript中以通用方式扩展第三方类?

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

tl;dr:我想以一种好的方式扩展第三方库的类。但是怎么做呢

假设我有一个第三方库,它创建了非常通用的实体
动物

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

这对我不起作用:在我的情况下-我不想扩展结构,区别只会在数据中。因此,就类型脚本而言,
,和
动物
将是相同的类型,因此您将无法编写接受
但不接受
的函数。然后,使其相同,它不必有不同的字段。