当与可选链接一起使用时,Typescript不理解未定义的返回类型
我有一个非常简单的代码:当与可选链接一起使用时,Typescript不理解未定义的返回类型,typescript,undefined,optional-chaining,Typescript,Undefined,Optional Chaining,我有一个非常简单的代码: const foo = (state: RootState): MyData => undefined; 这会产生一个错误: 类型“未定义”不可分配给类型“MyData” 这是非常合理的,因为我的类型MyData不允许未定义 但如果我现在写下: const foo = (state: RootState): MyData => state.data?.myData; 然后它就可以顺利地编译了。我不明白这里发生了什么,因为如果state.data是未定义的
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 = {
}
听起来好像
数据
在根状态
中不是可选的
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;
但是如果RootState
中的data
不是可选的,它会很高兴:
interface RootState {
data: {
myData: MyData;
}
}
它很高兴,因为TypeScript编译器知道那里的
?
是非功能的,因为数据
不是可选的,不能有未定义的值
,也不能有空值
。所以state.data.myData
和state.data?.myData
做的事情完全一样:生成类型为myData
的值。请向我们展示RootState
和myData
的定义(最小版本)。如果我做了,TypeScript会抱怨这两个函数。我不认为这很重要,让我补充一下。当我合理地猜测类型时,TypeScript会抱怨,正如你要求的那样()。也许你的类型定义中有data和myData,因为它们从来没有被定义过,所以typescript推断出可选的链接永远不会有问题?看来你是对的!没想到,typescript比我聪明:)谢谢,这似乎非常正确,尽管我希望typescript发出警告,不允许使用可选链接,或者更确切地说是C中的错误,例如@IlyaChernomordik,如果您使用的是typescript eslint,他们有一条规则,如果你在不必要的时候使用可选链接,它会提醒你:我会,谢谢,我会打开它,它的默认值是false