【发布时间】:2017-06-01 16:34:27
【问题描述】:
我有一个函数是axios.request 的包装器。
我将消息类型与配置一起发送,以便我可以使用response.data 创建新消息。
我有多种类型的消息,所以我创建了一个通用的TMessage 类型来处理这个:
public request<TMessage extends BaseMessage<TMessage>>(
config: Axios.AxiosXHRConfig<any>,
messageType: {new (message: string): TMessage}
): Promise<TMessage> {
return new Promise((resolve, reject) => {
axios.request(config).then((response: Axios.AxiosXHR<any>) => {
try {
let message = new messageType(response.data);
resolve(message);
} catch (err) {
reject(err);
}
}, reject);
});
}
我现在可以使用消息类型进行请求,并知道我得到什么类型的响应:
RestClient.request(config, SomeMessage).then((response: SomeMessage) => {
// response is of type SomeMessage, I have intellisense to help
resolve(response);
});
我想将此 messageType 设为可选,因为某些请求没有有用的响应,并且不需要实例化为新消息。
TypeScript 中有没有办法做到这一点?下面的代码使用了Union Types并进行编译,但是并没有强制messageType匹配返回类型,有点多余。
如果提供了 messageType,我想要一个 Promise<TMessage> 返回类型。否则我想要一个Promise<Axios.AxiosXHR<any>> 返回类型
public request<TMessage extends BaseMessage<TMessage>>(
config: Axios.AxiosXHRConfig<any>,
messageType?: {new (message: string): TMessage}
): Promise<TMessage | Axios.AxiosXHR<any>> {
...
-
RestClient.request(config, SomeMessage).then((response: OtherMessage) => {
// this compiles, ideally it should complain about the mismatch of message types
resolve(response);
});
【问题讨论】:
标签: reactjs typescript axios