【发布时间】:2017-12-31 02:31:57
【问题描述】:
我有以下功能:
class RestService {
public async get<T>(func: string): Promise<T> {
var toRet = {};
await fetch(EndPoint + func)
.then(response => response.json() as Promise<T>)
.then(data => {
toRet = data;
})
.catch(e => {
});
return toRet as T;
}
}
一切正常,但我在“数据”中得到的响应总是一个通用对象。
例如,我可能有这样的模型:
class Model
{
string name;
}
然后像这样调用函数:
get<Model>("getmodel")
响应始终是一个通用对象,如下所示:
{name:"some name"}
据我了解,Typescript 支持泛型,Promise 接受变量类型,我唯一的想法是我不能将泛型传递给泛型?
【问题讨论】:
-
如果响应总是一个模型,那么方法不应该是泛型的,它的返回类型应该是
Promise<Model>。你问的是这个吗? -
嗯,来自端点的响应是一个 json 对象,模型只是匹配 json 对象字段。我假设 Promise
其中 T 是类将使用 json 值自动填充类的实例。 -
所以我可能会调用 get
并期望返回类型为“AnotherModel”,但我会返回一个“对象”,其中的字段与“AnotherModel”中的变量声明匹配。 . -
不,它不会那样做。 response.json() 只是将 JSON 反序列化为 POJO。它不知道也不关心具体的泛型类型。而
toRet as T只是告诉 TypeScript 编译器:“相信我,对象是 T 类型的,我知道我在做什么”。 -
TypeScript 纯编译时,除非您明确编写,否则没有运行时转换/转换。
标签: json typescript generics promise