更好的 TypeScript 推理函数的返回类型,可以返回多个不同的对象



我有一个这样的函数:

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 像我想要的那样自动推断返回类型?

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

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

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

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

然后你应该得到你的窄类型:

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

最新更新