与可选链接一起使用时,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 = {

}

听起来 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;

Playground link

但如果 RootState 中的 data 不是可选的,那就太好了:

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

Playground link

很高兴,因为 TypeScript 编译器知道 ? 没有功能,因为 data 不是可选的,不能有值 undefined,并且可以' 的值为 null。所以 state.data.myDatastate.data?.myData 做完全一样的事情:产生一个 MyData.

类型的值