与可选链接一起使用时,Typescript无法理解未定义的返回类型

伊利亚·切尔诺莫迪克(Ilya Chernomordik)

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

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

}
TJ人群

听起来好像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它不是可选的,不能具有值undefined,也不能具有值null因此state.data.myDatastate.data?.myData做同样的事情:产生一个type的值MyData

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将Jest与Nuxt组件一起使用时无法读取未定义的属性$ loading

使Typescript strictNullChecks与未定义的返回原始js函数一起使用

无法获取querySelectorAll与puppeteer一起使用(返回未定义)

可以回显变量,但是在尝试与PDO一起使用时,PHP返回未定义的错误

与“ console.log”一起使用时未定义“ const”变量

将SDL2与Cmake / Linux / C ++一起使用时的未定义引用

与多部分数据的 multer 一起使用时,hasOwnproperty 变得未定义

解决将OnModelCreating与ApplicationDbContext一起使用时出现的“未定义键”错误?

与 angular 一起使用时,p5.js 中的变量未定义?

将SUM(tbl_column)与$ print一起使用时未定义的常量

将GTK与CMake一起使用时的“未定义引用”

在angularjs fullstack MEAN中这是未定义的。与间隔一起使用时

未被捕获的TypeError:无法读取未定义的属性'setDomLayout'-尝试使打印功能与AG-Grid一起使用时出错

将 v-model 与数组一起使用时,从 vue.js 获取无法读取未定义错误的属性

将NestJS与Fastify适配器和“ fastify-csrf”插件一起使用时,“无法读取未定义的属性'_csrf'”?

当将redux-saga与react-native-web一起使用时,我们会收到错误消息“无法读取未定义的属性'mark'”

为什么同构样式加载器会抛出 TypeError: 与 CSS-Modules 一起使用时无法读取未定义的属性“应用”

Ruby Lambda与myfunc一起使用时提供了一个未定义的方法。(someparam)

localStorage 返回未定义但可与控制台一起使用

将.setValues与空的嵌套数组一起使用时,Google脚本会写入“未定义”

将jquery.js与jquery-ui.js一起使用时,“未定义不是函数”

将Leaflet MarkerCluster与PhantomJs一起使用时,所有jQuery组件均未定义

未定义索引-Isset Guard无法与助手一起使用

ImageAdapter无法与String数组一起使用。这里无法理解错误

与TS一起检查两个可选参数是否已通过或未定义

未定义的ReferencEerror函数未定义,如何将typeof与if一起使用?

TypeScript可选类型和类型之间的区别 未定义

DoctrineCacheBundle:我无法理解将它与 redis 一起使用的文档

甲骨文 无法理解FOR如何与子查询SELECT INTO一起使用