我想知道我是否在作弊中欺骗或滥用通用约束。通过使用函数重载,您可以使类型检查真的很棒。
假设您有一些像
这样的动物类interface IAnimal {
legs: number
}
class Fish implements IAnimal { constructor(public legs = 0, public canSwim = true) {} }
class Reptile implements IAnimal { constructor(public legs = 6) { } }
class Bird implements IAnimal { constructor(public legs = 2, public canFly = true) { } }
class Mammal implements IAnimal { constructor(public legs = 4) { } }
使用函数重载,你可以像这样返回正确的类攻击类;
function createAnimal<T extends AnimalType.Bird>(type: T): Bird
function createAnimal<T extends AnimalType>(type: T): IAnimal
function createAnimal<T extends IAnimal>(animal: new() => T): T
function createAnimal(type: AnimalType): IAnimal {
if(!!arguments[0].prototype && !!arguments[0].prototype.constructor.name)
return new arguments[0]();
switch(arguments[0]) {
case AnimalType.Fish: return new Fish();
case AnimalType.Reptile: return new Reptile();
case AnimalType.Bird: return new Bird();
case AnimalType.Mammal: return new Mammal();
}
}
因为我已经说过AnimalType.Bird返回一个Bird我可以输入createAnimal(AnimalType.Bird).canFly
而没有任何编译错误
在使用上面的构造函数推理进行重载之后,我找到了这个; createAnimal(Fish).canSwim
对Enums使用Generic约束是否像滥用Typescript一样?