【问题标题】:Better TypeScript inference of the return type of a function that can return multiple different objects更好的 TypeScript 推断可以返回多个不同对象的函数的返回类型
【发布时间】:2020-05-12 08:37:21
【问题描述】:

我有这样的功能:

function foo() {
    if (Math.random() < 0.5) {
        return {
            a: 5
        };
    }

    return {
        b: false
    };
}

TypeScript 将返回类型推断为:

function foo(): {
    a: number;
    b?: undefined;
} | {
    b: boolean;
    a?: undefined;
}

出于我的目的,最好将其推断为:

function foo(): {
    a: number;
} | {
    b: boolean;
}

我知道我可以通过在foo 的定义中手动包含返回类型来强制执行此操作。但我问这个问题是因为实际上我有一个返回值要复杂得多的函数,我不想手动编写返回值的类型,然后永远保持同步。

有什么方法可以让 TypeScript 像我想要的那样自动推断返回类型?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    奇怪的是,如果你先将返回值分配给一个临时变量,返回类型就是你所期望的:

    function foo() {
        if (Math.random() > 0.5) {
            const ret = { a: 5 };
            return ret;
        } else { 
            const ret = { b: false };
            return ret;
        }
    }
    

    【讨论】:

    • 这正是我所做的
    • @AliHabibzadeh "这正是" --- 完全公平完全正确。这段代码只分配了一个要返回的对象,而你的则分配了两者。
    • 疯了!似乎你甚至不需要对他们两个都这样做,只需要一个。谢谢!
    【解决方案2】:

    通过将返回类型存储在 const, let 中来缩小和帮助 Ts。

    function foo() {
      const isInRage = Math.random() < 0.5;
      const inRageResults = { a: 5 };
      const outOfRangeResults = { b: false };
      return isInRage ? inRageResults : outOfRangeResults;
    }
    

    那么你应该得到你的窄类型:

    {
        a: number;
    } | {
        b: boolean;
    }
    

    【讨论】:

    • 试一试,如果它没有推断出所要求的内容,请投反对票。
    猜你喜欢
    • 1970-01-01
    • 2020-06-22
    • 2021-07-17
    • 1970-01-01
    • 2020-01-23
    • 2019-09-03
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多