【发布时间】:2020-11-01 07:37:48
【问题描述】:
我正在尝试使来自 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,但如果这个功能已经内置到带有 Optionals 的 TypeScript 和?运算符(可选链接)。如何让 TypeScript 为我的函数提供正确的返回类型?
【问题讨论】:
-
您是否尝试过使用“any”,例如:“let user: any = await postRequest();”
-
Typescript 无法知道它从服务器获得了什么,因为这是在运行时发生的。类型在运行时不存在。
-
@Evert 很抱歉,如果不清楚,但 .then 中返回的数据是 User 类型,因为我使用的是 axios.request 的类型化版本。我更新了问题以明确这一点。
-
@jcklopp 这将违背使用 TypeScript 的目的。我试图让 TypeScript 了解正确的用户类型是 User |空。
-
@Evert 如果我删除 .catch 块,则函数返回类型被正确识别为 Promise
,但是一旦我添加了 .catch,它就会变成 Promise 而不是 Promise .
标签: typescript promise optional