我在Typescript中使用了window.fetch,但我不能直接将响应转换为我的自定义类型:
我通过将Promise结果转换为一个中间的“any”变量来解决这个问题。
正确的方法是什么?
import { Actor } from './models/actor';
fetch(`http://swapi.co/api/people/1/`)
.then(res => res.json())
.then(res => {
// this is not allowed
// let a:Actor = <Actor>res;
// I use an intermediate variable a to get around this...
let a:any = res;
let b:Actor = <Actor>a;
})
5条答案
按热度按时间umuewwlo1#
编辑
自从前一段时间写这个答案以来,已经有了一些变化。正如评论中提到的,
response.json<T>
不再有效。不确定,找不到它是从哪里移走的。对于更高版本,您可以执行以下操作:
旧答案
下面是一些示例,从基本到在请求和/或错误处理之后添加转换:
基础:
数据转换:
通常,在将数据传递给使用者之前,您可能需要对数据进行一些调整,例如,展开顶级数据属性。这是直接的:
错误处理:
我认为你不应该在这个服务中直接捕获错误,而是允许它冒泡,但是如果你需要,你可以做以下事情:
g6baxovj2#
实际上,在typescript中的几乎任何地方,只要传递的类型兼容,向具有指定类型的函数传递值就可以按需工作。
话虽如此,以下作品…
我想把所有的http调用都 Package 在一个可重用的类中--这意味着我需要一些方法让客户端以所需的形式处理响应。为了支持这一点,我接受回调lambda作为我的 Package 器方法的参数。lambda声明接受任何类型,如下所示…
但是在使用中,调用者可以传递一个指定所需返回类型的lambda。我从上面修改了我的代码,就像这样...
以便客户端可以通过回调调用它,例如...
hzbexzde3#
如果您查看@types/node-fetch,您将看到body定义
这意味着你可以使用泛型来实现你想要的。我没有测试这段代码,但它看起来像这样:
7rfyedvj4#
这是专门为
POST
请求编写的。这就是为什么它有“variables”参数的原因。在“GET”请求的情况下,相同的代码将起作用,vriables可以是可选的vfwfrxfs5#
对于此特定用例:
从远程资源获取数据,我们无法控制,并且希望在注入当前应用程序之前验证筛选器
推荐zod npm包https://www.npmjs.com/package/zod
以如下方式: