Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当与可选链接一起使用时,Typescript不理解未定义的返回类型_Typescript_Undefined_Optional Chaining - Fatal编程技术网

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

当与可选链接一起使用时,Typescript不理解未定义的返回类型,typescript,undefined,optional-chaining,Typescript,Undefined,Optional Chaining,我有一个非常简单的代码: const foo = (state: RootState): MyData => undefined; 这会产生一个错误: 类型“未定义”不可分配给类型“MyData” 这是非常合理的,因为我的类型MyData不允许未定义 但如果我现在写下: const foo = (state: RootState): MyData => state.data?.myData; 然后它就可以顺利地编译了。我不明白这里发生了什么,因为如果state.data是未定义的

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

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

}

听起来好像
数据
根状态
中不是可选的

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编译器知道那里的
是非功能的,因为
数据
不是可选的,不能有
未定义的值
,也不能有
空值
。所以
state.data.myData
state.data?.myData
做的事情完全一样:生成类型为
myData

的值。请向我们展示
RootState
myData
的定义(最小版本)。如果我做了,TypeScript会抱怨这两个函数。我不认为这很重要,让我补充一下。当我合理地猜测类型时,TypeScript会抱怨,正如你要求的那样()。也许你的类型定义中有data和myData,因为它们从来没有被定义过,所以typescript推断出可选的链接永远不会有问题?看来你是对的!没想到,typescript比我聪明:)谢谢,这似乎非常正确,尽管我希望typescript发出警告,不允许使用可选链接,或者更确切地说是C中的错误,例如@IlyaChernomordik,如果您使用的是typescript eslint,他们有一条规则,如果你在不必要的时候使用可选链接,它会提醒你:我会,谢谢,我会打开它,它的默认值是false