我创建了以下函数工厂,该函数工厂应为给定的类创建类型防护。
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