我有一个函数myFunc<T1, T2 = undefined>
,如果还有[T1]
,则返回T2 extends undefined
,否则返回[T1, T2]
。不用// @ts-ignore
就能实现这样的功能吗?
function myFunc<T1, T2 = undefined>(t1: T1, t2?: T2): T2 extends undefined ? [T1] : [T1, T2] {
if (t2 === undefined) {
return [t1];
}
return [t1, t2];
}
此语法在每个return
语句中给我一个TypeScript错误,表示该值不可分配给T2 extends undefined ? [T1] : [T1, T2]
。
答案 0 :(得分:1)
条件类型通常会在实现中引起问题。除了完全相同的条件类型以外,您不能为仍然具有未解析类型参数的条件类型分配任何内容。因此,打字稿不允许您将[T1]
或[T1, T2]
分配给返回值。
您可以使用类型断言,也可以使用单独的实现签名,该签名返回一个并集。我个人更喜欢第二种选择:
function myFunc<T1, T2 = undefined>(t1: T1, t2?: T2): T2 extends undefined ? [T1] : [T1, T2]
function myFunc<T1, T2 = undefined>(t1: T1, t2?: T2): [T1] | [T1, T2] {
if (t2 === undefined) {
return [t1];
}
return [t1, t2];
}