我有一个非常简单的代码:
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 = {
}
>听起来data
在RootState
中不是可选的。
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;
游乐场链接
但如果data
RootState
不是可选的,那就很高兴了:
interface RootState {
data: {
myData: MyData;
}
}
游乐场链接
很高兴,因为 TypeScript 编译器知道那里的?
是非功能性的,因为data
不是可选的,不能有值undefined
,也不能有值null
。因此,state.data.myData
和state.data?.myData
做完全相同的事情:生成类型为MyData
的值。