gpt4 book ai didi

javascript - 如何在 typescript 中以通用方式扩展第 3 方类?

转载 作者:行者123 更新时间:2023-12-03 01:19:12 25 4
gpt4 key购买 nike

tl;dr:我想以一种很好的方式扩展第 3 方库的类。但如何呢?

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

class Animal {
type: string;
}

我想创建一只和一只:

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 {}

但是这种方法有很多缺点:

  • 我会在运行时有额外的类;
  • 我必须手动描述每个类别(猫、狗);
  • 我必须在每个“create”函数中强制转换类型(return ... as Cat);

我想要看到的是这样的:

function createCat(): Animal<Cat> {
return ...;
}

这可能吗?或者也许有任何不同的方法?

谢谢。

最佳答案

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

关于javascript - 如何在 typescript 中以通用方式扩展第 3 方类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51837189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com