我正在尝试使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] 删除。
我来说两句