是否可以指定一个泛型类型,它是两个可能的联合类型之一,但不能包含来自任何一个类型的非重叠元素?
我想做的是
type TrueFalseType = "true" | "false"
type ABType = "A" | "B"
const myFunction = <T extends ABType | TrueFalseType>(values: Array<T>) => {
console.log(values)
}
myFunction(["A", "B"]) // should be allowed
myFunction(["true", "false"]) // should be allowed
myFunction(["A", "false"]) // should be compile error
字符串
这没有按预期工作,因为最后一行正在编译,而我希望它是一个错误。如何更改泛型类型定义,使其只允许ABType
或TrueFalseType
类型T,而不允许两者中的元素?
1条答案
按热度按时间kmpatx3s1#
最直接的方法是放弃generics,只让
values
成为您想要支持的两种不同数组类型的并集:字符串
由于
["A", "false"]
既不是ABType[]
,也不是TrueFalseType[]
,因此它被拒绝。如果出于某种原因你需要泛型,你可能仍然应该用
values
的类型来表达它,并将你的类型参数约束为相同的数组类型的联合:型
这里我将类型参数命名为
U
,只是为了表明它与您的T
不同,T
是数组 * 元素 * 类型。如果需要计算,可以通过indexing intoU
和number
来完成(因为用数字键索引数组会产生数组元素)。即type T = U[number]
。对于调用者而言,其行为相同:
型
Playground代码链接