有以下代码:
const foo = (flag: boolean) => {
if (flag) {
return {
success: true,
data: {
name: "John",
age: 40
}
}
}
return {
success: false,
data: null
}
}
const result = foo(true);
if (result.success) {
console.log(result.data.name); // TS error: 'result.data' is possibly 'null'
}
如果
data
设置为 flag
,为什么打字稿不能推断 true
始终存在?
我知道我可以通过定义函数的返回类型来解决这个问题,但如果 TS 自动推断它会很好。
也许此代码修复:
interface ReturnSuccess {
success: true
data: { name: string; age: number }
}
interface ReturnFailure {
success: false
data: null
}
const foo = <Flag extends boolean, Return extends Flag extends true ? ReturnSuccess : ReturnFailure>(flag: Flag): Return {
if (flag) {
return {
success: true,
data: {
name: "John",
age: 40
}
} as Return
}
return {
success: false,
data: null
} as Return
}