Typescript 在与可选链接一起使用时不理解未定义的返回类型



我有一个非常简单的代码:

const foo = (state: RootState): MyData => undefined;

这会产生一个错误:

类型"未定义"不能分配给类型"MyData"。

这是非常合理的,因为我的类型MyData不允许未定义。

但是如果我现在写这个:

const foo = (state: RootState): MyData => state.data?.myData;

然后它编译没有麻烦。我不明白这里发生了什么,因为如果state.data是未定义的,那么它应该真正返回未定义,并且对编译器来说应该是很明显的。

我在这里错过了什么吗?

附言这是类型的最小示例:

type State = {
data: {
myData: MyData;
};
}
type MyData = {
}

>听起来dataRootState中不是可选的。

TypeScript 抱怨这两个函数,因为 - 正如你所说 -MyData | undefined不能分配给MyData

interface RootState {
data?: {
myData: MyData;
}
}
interface MyData {
bar: string;
}
const foo1 = (state: RootState): MyData => undefined;
const foo2 = (state: RootState): MyData => state.data?.myData;

游乐场链接

但如果dataRootState不是可选的,那就很高兴了:

interface RootState {
data: {
myData: MyData;
}
}

游乐场链接

很高兴,因为 TypeScript 编译器知道那里的?是非功能性的,因为data不是可选的,不能有值undefined,也不能有值null。因此,state.data.myDatastate.data?.myData做完全相同的事情:生成类型为MyData的值。

最新更新