通用字体保护工厂

时间:2019-03-03 02:19:02

标签: typescript generics

我创建了以下函数工厂,该函数工厂应为给定的类创建类型防护。

interface Constructable<T> extends Function {
    new (...args: any[]): T;
}

function instanceOf<T>(_class: Constructable<T>) {
  return (obj): obj is T => obj instanceof _class;
}

我在以下getDogs函数上对其进行了测试,它可以按预期工作(返回类型为Dog [])

class Animal { }
class Dog extends Animal { }
const animals: Animal[] = [];

function getDogs() {
  return animals.filter(instanceOf(Dog));
}

const dogs1 = getDogs(); // type of dogs1 is Dog[]

不幸的是,它不适用于通用函数getAnimalsOfType(返回类型为Animal []而不是Dog [])

function getAnimalsOfType<T extends Constructable<Animal>>(animalType: T) {
  return animals.filter(instanceOf(animalType))
}

const dogs2 = getAnimalsOfType(Dog); // type of dogs2 is Animal[]

我的instanceOf / getAnimalsOfType实现有什么问题?提前致谢。 https://stackblitz.com/edit/typescript-rzswyg

0 个答案:

没有答案