1

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

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

这给出了一个错误:

类型“未定义”不可分配给类型“MyData”。

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

但如果我现在写这个:

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

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

我在这里错过了什么吗?

PS这是类型的最小示例:

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

type MyData = {

}
4

1 回答 1

2

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

游乐场链接

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

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

游乐场链接

很高兴,因为 TypeScript 编译器知道它?是非功能性的,因为data它不是可选的,不能有 value undefined,也不能有 value null。所以state.data.myDatastate.data?.myData做同样的事情:产生一个 type 的值MyData

于 2020-05-22T14:08:17.717 回答