【发布时间】:2019-09-06 06:54:41
【问题描述】:
我正在编写一个库,可以让您插入外部实现,并且我正在尝试找出为这些编写类型的最佳方法。
示例
abstract class Animal {
public abstract makeSounds();
}
class Dog extends Animal {
public makeSounds() {
console.log('woof');
}
}
class Cat extends Animal {
public makeSounds() {
console.log('meow');
}
}
type BuiltinAnimals = 'cat' | 'dog';
interface AnimalLike {
[name: string]: new () => Animal;
}
default class ZooClient {
public mostFamousAnimal: Animal;
constructor(someAnimal: BuiltinAnimals | AnimalLike) {
if (typeof someAnimal === 'string') {
// if 'dog', load `Dog` and if 'cat', load `Cat`.
// this.mostFamousAnimal = new Cat() or new Dog();
} else {
// load external animal plugin
// this.mostFamousAnimal = new [someAnimal]();
}
}
public makeSounds() {
this.mostFamousAnimal.makeSounds();
}
}
我想公开几个可以方便使用的内置类,或者用户可以自带类。我该怎么做?
const zoo = new ZooClient('dog');
// or
const zoo = new ZooClient(new Dolphin()); // Or perhaps `new ZooClient(Dolphin)`?
我正在寻找一种简洁的方式,能够为ZooClient 的用户提供不错的选择 - 类型信息应该让他们知道他们可以使用字符串 (BuiltinAnimal) 或他们自己的类Animal 的实现。
【问题讨论】:
-
ZooClient的实例实际上应该做什么? “加载”Dog、Cat是什么意思? -
我添加了更多代码来帮助更好地解释我的用例。
-
所以
ZooClient不需要记住它拥有什么类型的动物?只是Animal?那么如果Dog有chaseCars()方法,Cat有chaseMice()方法,就不需要new ZooClient('dog').mostFamousAnimal.chaseCars()编译了? -
你当前的签名有
AnimalLike,更像是{"dolphin": Dolphin}作为参数。但是,是的,new ZooClient(Dolphin)会更有意义。 -
@jcalz
Cat和Dog都扩展了Animal,我只对使用makeSounds()感兴趣,Animal的每个实现都会定义它。我正在寻找一种巧妙的方法,能够为ZooClient的用户提供不错的选择 - 类型信息应该让他们知道他们可以使用字符串 (BuiltinAnimal) 或他们自己实现 @ 的类987654347@.
标签: javascript typescript types abstract-class