【发布时间】:2021-12-07 02:21:15
【问题描述】:
我正在尝试将 js 代码转换为 ts,我有这个:
function api<T>(url: string): Promise<T> {
return fetch(url)
.then((res) => {
return res.json().then((resJson: T) => ({
ok: res.ok,
status: res.status,
body: resJson,
}));
})
.then((res) => {
if (res.ok) {
return res.body;
}
return Promise.reject({
status: res.status,
message: res.body.message,
});
});
}
我不知道如何解决这个问题
message: res.body.message // Property 'message' does not exist on type 'T'
只有当 res.ok === false 时,我的 body-response 才包含“message”属性作为可选属性。如何解决这种情况? 大概用法:
type ResBody = {
success: boolean;
message?: string;
data?: string[];
};
api<ResBody>("https://example.com")
.then(({ success, data }) => {
console.log(success, data);
})
.catch((err) => {
console.log(err.message, err.status)
});
【问题讨论】:
-
你能在这里解释一下你对泛型的使用吗?特别是泛型类型
T?api<T>怎么称呼?也就是说T的类型实际上是如何确定的。最后的res.body是T类型,因为你在前面的body: resJson中这样做了,并且在上面声明resJson是T类型...但是T没有消息属性,因为它是未知类型!给我详细信息,我可以很容易地解决这个问题。或提供minimal reproducible example。 -
添加了对帖子的更改
-
再一次,你能解释一下为什么
api<T>首先使用泛型吗?也就是说,你为什么不只是说resJson: ResBody?必须有使用泛型的理由。答案对于提供正确的解决方案很重要。否则我下面的答案是一个最好的猜测/破解。 -
刚开始学ts,拿了here的泛型例子
-
好吧,我的错。 Promise 被定义为泛型,因此您(用户)可以使用任何解析类型加载它,然后能够在结果中引用它。在这种情况下,我的回答会奏效......但我会在几分钟内更新它并提供更多细节。
标签: typescript fetch