TypeScript无法推断诺言类型

用户名

我正在尝试使axios请求的响应类型安全,但是在使TypeScript编译器正确推断类型时遇到问题。考虑以下函数,该函数仅返回axios请求,该请求在.then块中返回所需的数据,并使用.catch块捕获任何错误:

interface ServerResponse {
  data: {
    User_by_pk: User;
  };
}

interface User {
  id: string;
  password: string;
}

function postRequest() {
  return axios
    .request<ServerResponse>({
      method: 'POST',
      url: 'http://example.com',
      data: someData
    })
    .then((res) => {
      return res.data.data.User_by_pk; //User type
    })
    .catch((error: AxiosError<ServerResponse>) => {
      console.log(error.message);
      return null;
    });
}

我以为该函数将获得返回类型Promise<User | null>(.then中返回的数据为User类型),但是,它将获得返回类型Promise<any>将null更改为undefined会得到相同的结果。我什至尝试显式说明该函数的返回类型,但是在使用例如let user = await postRequest();变量user调用该函数时,会得到该类型User而不是User | null预期的那样。

如果删除.catch块,则该函数的返回类型将被正确识别为Promise<User>,但是一旦添加.catch,它将变为Promise<any>而不是Promise<User | null>

我做了一些谷歌搜索,有些人建议使用Maybe或Result类型的库,例如True Myth,但是如果此功能已经内置在TypeScript中,并且带有Optionals和?运算符(可选链接)。如何获取TypeScript以给出函数的正确返回类型?

用户名

因此,事实证明我的tsconfig中只有一个错误,该错误使文件不包括在内,因此严格检查已关闭。一旦修复,我的原始代码就可以推断出正确的类型!因此,如果其他任何人都遇到此问题,请确保已打开strict,并且您的文件包含在tsconfig的include部分中。

为了重现,以下函数的返回类型是string严格关闭和"true" | null打开严格时。这显然是您想要的行为:)

function test(input: boolean) {
  if (input) return 'true';
  else return undefined;
}

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章