【发布时间】:2019-10-13 15:21:30
【问题描述】:
我正在尝试创建以下double 函数:
type MaybeArray<T> = T | T[];
function double<T extends MaybeArray<number>>(data: T): T extends number[] ? number[] : number {
if (Array.isArray(data)) {
// TypeScript does not recognize that `data` here is an array of numbers.
return data.map((n) => double(n));
}
// TypeScript does not recognize that `data` here is a number.
return data * 2;
}
该函数应该返回给定数字的双精度数,或者如果给定一个列表,则返回一个具有双精度数的数组。 请查看我上面链接的操场上的错误。
但 TypeScript 无法识别 if 块内的 data 参数是一个数字数组,而 if 块外的 data 参数是一个普通数字。
我该如何解决这个问题?
P.S.:我知道通过使用函数重载可以解决这个问题,但我想知道是否可以在没有任何重载的情况下修复它。
【问题讨论】:
-
这是因为this TS 设计限制:扩展联合类型的泛型无法通过控制流分析适当地缩小范围。也看看this answer。
标签: typescript