微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自定义承诺函数中的通用返回类型

如何解决自定义承诺函数中的通用返回类型

我使用泛型创建了一个可重用的函数,用于获取数据,以便每个响应都匹配指定的类型。我如何为这个函数实现一个通用的返回类型,我可以在调用函数时指定它? (代码块 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 APItyped 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 可能是您要走的路。

Playground link to code

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?