【发布时间】:2020-05-15 17:25:04
【问题描述】:
我有一个向服务器发出请求的方法,根据 URL,它可能会返回完全不同形状的数据。
在此之前,我只是将预期的接口转换为返回的对象:
const data = Promise.resolve(makeSignedRequest(requestParameters));
return data as Promise<AwesomeResponse>;
但今天我遇到了这种语法,我可以明确地告诉方法我期望什么样的数据:
const data = Promise.resolve(makeSignedRequest<AwesomeResponse>(requestParameters));
return data;
现在。 makeSignedRequest 可能会返回AwesomeResponse、GreatResponse、AmazingResponse 等类型,但所有这些都有一个共同点。它们都共享相同的结构 - BaseResponse 的结构。
我所有的回复都扩展了BaseResponse,所以我们很酷。
说了这么多,TypeScript 还在抱怨下面的代码:
import https from "https";
export interface BaseResponse {
meta: {};
data: Array<{}>;
error?: {
statusCode: number | undefined;
statusMessage: string | undefined;
};
}
export const makeSignedRequest = <T>(url): Promise<T> => {
return new Promise((resolve, reject) => {
// create Request with event listeners
const req = https.request(url, (res) => {
res.on("end", () => {
if (res.statusCode !== 200) {
resolve({
data: [],
meta: {},
error: {}
});
}
});
});
});
};
resolve({data: [], 被 VS Code 强调,因为正如我在标题中提到的,
Argument of type '{ data: never[]; meta: {}; error: { statusCode: number | undefined; statusMessage: string | undefined; }; }' is not assignable to parameter of type 'T | PromiseLike<T> | undefined'.
Object literal may only specify known properties, and 'data' does not exist in type 'PromiseLike<T>'.
我在这里错过了什么?
【问题讨论】:
-
你能把它缩减成minimal reproducible example吗?
-
我已经更新了仍然产生相同打字稿错误的代码示例。
标签: node.js typescript