我有两个类,A和B,每个类(ISA和ISB)都有一个谓词函数,还有一个数组arr
,其中包含这两个类的几个实例.当使用谓词函数过滤数组时,它正确地仅返回请求的实例,并且在类型级别上简化为仅包含请求的类的数组:
class A { }
class B { }
const isA = (
x: any
): x is A => {
return x instanceof A;
};
const isB = (
x: any
): x is B => {
return x instanceof B;
};
const arr: Array<A | B> = [new A(), new A(), new B()]
const onlyA = arr.filter(isA) // correct type: const onlyA: A[]
const onlyB = arr.filter(isB) // correct type: const onlyB: B[]
我的目标是编写一个函数getInstance()
,它接受一个带有字符串值"a"和/或"b"的数组,并且只返回这个/这些名称的实例(S),例如,getInstance(["a"])
应该具有与上面的onlyA
相同的返回值,getInstance(["a", "b"])
应该返回A和B的实例,并且在类型级别(A | B)[]
上.
我try 创建一个将字符串与谓词函数相关联的新对象Obj
.我使getInstance()
成为泛型,并将其唯一参数约束为键Obj
.但是,此实现在类型级别上不起作用.
const Obj = {
a: isA,
b: isB
}
const getInstance = <T extends keyof typeof Obj>(types: T[]) => {
const fns = types.map(type => Obj[type])
const set = fns.map(fn => arr.filter(() => fn))
return set.flat(1)
}
const retA = getInstance(["a"]) // wrong return type: (A | B)[]; should return A[]
const retAB = getInstance(["a", "b"]) // should return (A | B)[]