如何将 fetch API 响应转换为 TypeScript 中的特定类型?

Posted

技术标签:

【中文标题】如何将 fetch API 响应转换为 TypeScript 中的特定类型?【英文标题】:How to cast fetch API response to a specific type in TypeScript? 【发布时间】:2019-09-21 10:57:58 【问题描述】:

我正在尝试将 API 调用的响应转换为我的代码中的特定类型 (TypeScript)。但是,我没有成功地将响应转换为我的类型,而只是对象。

我尝试了几种方法,特别是这里描述的:https://www.carlrippon.com/fetch-with-async-await-and-typescript/

类型:

export interface MyType
  id: number;
  name: string;
  date: Date;


获取代码:

export default class api 
  static async get<T>(url: string): Promise<T> 
    return new Promise(resolve => 
      fetch(url)
        .then(response => response.json())
        .then(body => 
          resolve(body);
        );
    );
  

来电者:

const result = await api.get<MyType[]>(
      "my-url-here"
    );

我希望resultMyType[] 类型,但它是Object[]。 (包含所有字段)

此外,我尝试将 name 字段的类型更改为 number(同时始终保持来自 API 的相同响应,即名称是一些不可转换为数字的字符串)并预计会出现一些类型转换错误,但是没有。 result 仍然使用相同的内容和相同的类型创建: result: Array(3) [Object, Object, Object]

好像根本没有选角。

你能告诉我我哪里错了,并告诉我该怎么做吗?

非常感谢。

【问题讨论】:

在the TS playground 中尝试您的类型时,一切似乎都很好。问题一定出在其他地方。 TypeScript 只是一个编译器。它编译为 javascript,其中类型(除了 JS 类型:布尔、数字、对象等)不再存在。 TypeScript 中没有强制转换。你的代码所做的就是对编译器说:相信我,我的 API 返回的对象将如下所示。在运行时,对象只是 POJO,根本不进行类型检查。 谢谢@JBNizet,这对我来说很清楚! 【参考方案1】:

预计会出现一些类型转换错误,但没有。

TypeScript 不强制转换。它断言。这是一种让您有针对性地告诉编译器在运行时会发生什么的方法。如果它在运行时不是那样,它在你身上。

修复

选项:

更改后端响应,使其与您声明的内容相匹配。 更改断言以匹配后端返回的内容。

更多

TypeScript Assertion

【讨论】:

以上是关于如何将 fetch API 响应转换为 TypeScript 中的特定类型?的主要内容,如果未能解决你的问题,请参考以下文章

试图将 jquery AJAX 转换为 Fetch API,如何设置RequestHeader?

如何在 JavaScript 中将 Ajax 转换为 Fetch API?

我如何使用 fetch API 并在状态下存储响应?

如何在 fetch api 中处理 HTTP 代码 4xx 响应

使用像 fiddler 这样的代理和 fetch api

Javascript - 如何知道Fetch API中的响应类型?