如何解决自定义承诺函数中的通用返回类型
我使用泛型创建了一个可重用的函数,用于获取数据,以便每个响应都匹配指定的类型。我如何为这个函数实现一个通用的返回类型,我可以在调用函数时指定它? (代码块 2)
const fetcher = (url: string) => {
return new Promise(async (resolve,reject) => {
try {
const res = await axios.get(url,{
headers: { Accept: "application/json" },});
resolve(res.data);
} catch (e) {
Alert.alert(e.message);
reject();
}
});
};
interface Test {
id: number;
title: string;
}
fetcher("test.com").then((value: Test) => {
// Do something with value
});
我得到的错误:
'(value: Test) => void' 类型的参数不能分配给'(value: unkNown) => void 类型的参数 | PromiseLike'。
参数“value”和“value”的类型不兼容。
“未知”类型不能分配给“测试”类型。 ts(2345)
解决方法
您可能想让 Promise
成为 Promise<any>
。 any
"type" 根本就不是一个类型;相反,它会关闭对该类型值的类型检查。这将允许您将 value
回调参数注释为 Test
,而不会受到编译器的投诉。
这类似于通过 json()
method 返回的 Body
对象上的 Fetch API 是 typed i n TypeScript 以返回 Promise<any>
的方式。根本不是类型安全的,但它允许您在不与编译器冲突的情况下指定类型:
const fetcher = (url: string) => {
return new Promise<any>(async (resolve,reject) => { // <-- change on this line
try {
const res = await axios.get(url,{
headers: { Accept: "application/json" },});
resolve(res.data);
} catch (e) {
Alert.alert(e.message);
reject();
}
});
};
fetcher("example.com").then((value: Test) => {
console.log(value.id.toFixed());
});
当然,缺乏类型安全意味着您、开发者(或 fetcher()
的任何用户)需要小心。没有什么能阻止你写作,例如:
interface Other {
id: string;
}
fetcher("example.com").then((value: Other) => {
console.log(value.id.toUpperCase());
});
类型注释是来自发出的 JavaScript 的 erased,而 example.com
(有一个真正的 test.com
,所以我不会将其用于测试,仅供参考)不会看到区别在两次调用之间,因此它无法知道第一个调用需要 id
类型的 number
属性,而第二个调用需要 id
类型的 string
属性。因此,至少其中之一可能会导致运行时错误。
有更多类型安全的方法来编写这样的东西,但它们将涉及在运行时实际检查您的假设的类型保护。但是,如果您只想手动断言响应的类型并继续,any
可能是您要走的路。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。