根据类型保护推断函数的返回类型

Fuz*_*yma 3 typescript

我有以下定义:

function foo(arg: number[] | number) {
    if (Array.isArray(arg)) {
        return [1]
    }

    return 0
}
Run Code Online (Sandbox Code Playgroud)

我希望打字稿能够自动找出返回类型是什么。由于类型保护,isArray()它知道 arg 是否是一个 Array 并且可以将返回类型显示为number[]。但是, usingfoo(...)显示其返回值number[] | 0即使在传递数组时也是如此。

  foo([]).push() // error because push doesnt exist on type 0
Run Code Online (Sandbox Code Playgroud)

这是一个设计限制,一个错误,还没有实现,还是其他一些问题?

T.J*_*der 5

我不能明确指出这是设计限制,但我见过像jcalzTitian 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);
Run Code Online (Sandbox Code Playgroud)

游乐场链接

  • 是的,我知道,但是如果您不需要定义所有重载,那该有多酷...... (2认同)