如何在打字稿中以通用方式扩展3rd Party类?

时间:2018-08-14 08:39:13

标签: javascript typescript es6-class typescript-generics

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 ...;
}

有可能吗?还是任何其他方法?

谢谢。

1 个答案:

答案 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