【问题标题】:Typescript does not understand undefined return type when used with optional chaining与可选链接一起使用时,Typescript 不理解未定义的返回类型
【发布时间】:2020-09-09 09:30:58
【问题描述】:

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

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 = {

}

【问题讨论】:

  • 请向我们展示RootStateMyData 的定义(最小版本)。如果我创建reasonable guesses,TypeScript 会抱怨这两个函数。
  • 觉得不重要,我补充一下
  • 当我对类型做出合理猜测时,打字稿会在您要求时抱怨(typescriptlang.org/play/…)。也许您的类型定义中的 data 和 myData 永远不会未定义,因此 typescript 推断出可选链接永远不会重要?
  • 看来你是对的!没想到,打字稿比我聪明:)

标签: typescript undefined optional-chaining


【解决方案1】:

听起来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 类型的值。

【讨论】:

  • 谢谢,这似乎非常正确,尽管我希望 typescript 发出警告,指出不允许使用可选链接,或者更确切地说是 C# 中的错误,例如
  • @IlyaChernomordik 如果您使用的是 typescript-eslint,他们有一条规则,如果您在不需要时使用可选链接,他们会提醒您:github.com/typescript-eslint/typescript-eslint/blob/master/…
  • 我愿意,谢谢,会打开它,它的默认值为false
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多