使用Enum约束的泛型类型参数推断

时间:2018-02-13 20:21:23

标签: typescript generics

我想知道我是否在作弊中欺骗或滥用通用约束。通过使用函数重载,您可以使类型检查真的很棒。

假设您有一些像

这样的动物类
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一样?

0 个答案:

没有答案