我有以下定义:
function foo(arg: number[] | number) {
if (Array.isArray(arg)) {
return [1]
}
return 0
}
我希望 typescript 能够自动确定返回类型是什么。由于类型保护 isArray()
,它知道 arg 是否为数组,并且可以将返回类型显示为 number[]
。但是,使用 foo(...)
将其返回值显示为 number[] | 0
即使在传递数组时也是如此。
foo([]).push() // error because push doesnt exist on type 0
这是设计限制、错误、尚未实现还是其他问题?
最佳答案
我不能明确指出这是设计限制,但我见过像 jcalz 这样的专家。和 Titian Cernicova-Dragomir引用类型推断受限的各种地方,有时不是因为它不能做我们想要的,而是因为这样做的成本太高(就运行时成本或编译器中的代码复杂性而言)。我怀疑这属于该类别。
您可能知道这一点,但对于您的具体示例,您可以使用重载来获得您想要的结果:
function foo(arg: number[]): number[];
function foo(arg: number): number;
function foo(arg: number[] | number) {
if (Array.isArray(arg)) {
return arg.map(v => v * 2);
}
return arg * 2;
}
foo([]).push(10);
关于typescript - 根据类型保护推断函数的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64087763/