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

标签 typescript

我有以下定义:

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);

Playground link

关于typescript - 根据类型保护推断函数的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64087763/

相关文章:

typescript - 类型 'Observable<{}>' 不可分配给类型 'Observable<boolean> | boolean '

javascript - componentWillMount 函数内更新的类级别变量在函数调用后无法在 render 方法中访问

javascript - 如何优化此计算器中的类型描述?

angular - 如何应用样式属性 Angular 自动完成

javascript - 有没有办法在 JavaScript/TypeScript 中对数组中的每个数组递归执行 .map ?

typescript - 如何将整数从 Typescript 枚举转换为其键值作为键的联合类型?

angular - 传单图: Rotated Marker for ionic2 (Typescript)

typescript - Typescript 中 typeof Array[number] 的含义是什么?

javascript - 是否值得在 CMS 中使用 TypeScript?

typescript - 如何在 Ionic 2 选项卡中触发自定义功能?