繁体   English   中英

为什么 Typescript 在可能返回 object 类型被明确定义时不能正确推断返回值?

[英]Why doesn't Typescript infer return values correctly when possible return object types are specifically defined?

我试图了解 Typescript 如何从 function 调用中推断返回值。 假设我有一个名为sendRequest的 function 可以返回两个特定格式的对象。 为什么 Typescript 不能知道如果loadingtruedata唯一可能的值是null ,如果loadingfalsedata唯一可能的值是Data类型? 它仍然说data可能是null即使根据列出的可能返回类型这是不可能的。

type Data = { firstName: string; lastName: string };

type ReturnType =
  | { loading: true; data: null }
  | { loading: false; data: Data };

const sendRequest = (fetch: boolean): ReturnType => {
  if (fetch) {
    return { loading: true, data: null };
  }

  return { loading: false, data: { firstName: 'Bart', lastName: 'Simpson' } };
};

const { loading, data } = sendRequest(true);

if (loading) {
  data; // <-- Typescript says that `data` can be either `Data` or `null`, while based on the return type, and since `loading` if `true`, `data` can't be `null`.
}

在您解构变量之前,这将作为一个有区别的联合 TypeScript 可以理解 union 的数据类型取决于loading的值,但是一旦将其分成两个变量,它就不会保留此信息。

const ret = sendRequest(true);

if (!ret.loading) {
  ret.data; // <-- This is now of type Data, not null.
}

游乐场链接

正如jcalz在评论中指出的那样,您请求的行为被跟踪为microsoft/TypeScript#30581 (感谢jcalz!)

首先值得注意的是,您不想使用ReturnType作为自定义类型名称,因为从 TypeScript 2.8 开始,它实际上具有保留用途。

但是要回答您的问题: TypeScript 抱怨的原因是因为您就是这样指定返回类型的。 loadingtrue时, datanull

type Response =
  | { loading: true; data: null }
  | { loading: false; data: Data };

事实上,我很惊讶 TypeScript 甚至将其键入为Data | null Data | null而不是单独的null 在 TS Playground 中确实如此:

名为 data 的变量的类型似乎为 Data 或 null

只是让你知道。 现在可以了。

参考: https://github.com/microsoft/TypeScript/pull/47109

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM