与可选链接一起使用时,Typescript 无法理解未定义的 return 类型
Typescript does not understand undefined return type when used with optional chaining
我有一个非常简单的代码:
const foo = (state: RootState): MyData => undefined;
这给出了一个错误:
Type 'undefined' is not assignable to type 'MyData'.
这很合理,因为我的类型 MyData
不允许未定义。
但是如果我现在这样写:
const foo = (state: RootState): MyData => state.data?.myData;
然后编译就没有问题了。我不明白这里发生了什么,因为如果 state.data
未定义那么它应该真正返回未定义并且对编译器来说应该很明显。
我是不是漏掉了什么?
P.S。这是类型的最小示例:
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;
但如果 RootState
中的 data
不是可选的,那就太好了:
interface RootState {
data: {
myData: MyData;
}
}
很高兴,因为 TypeScript 编译器知道 ?
没有功能,因为 data
不是可选的,不能有值 undefined
,并且可以' 的值为 null
。所以 state.data.myData
和 state.data?.myData
做完全一样的事情:产生一个 MyData
.
类型的值
我有一个非常简单的代码:
const foo = (state: RootState): MyData => undefined;
这给出了一个错误:
Type 'undefined' is not assignable to type 'MyData'.
这很合理,因为我的类型 MyData
不允许未定义。
但是如果我现在这样写:
const foo = (state: RootState): MyData => state.data?.myData;
然后编译就没有问题了。我不明白这里发生了什么,因为如果 state.data
未定义那么它应该真正返回未定义并且对编译器来说应该很明显。
我是不是漏掉了什么?
P.S。这是类型的最小示例:
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;
但如果 RootState
中的 data
不是可选的,那就太好了:
interface RootState {
data: {
myData: MyData;
}
}
很高兴,因为 TypeScript 编译器知道 ?
没有功能,因为 data
不是可选的,不能有值 undefined
,并且可以' 的值为 null
。所以 state.data.myData
和 state.data?.myData
做完全一样的事情:产生一个 MyData
.