我有一个函数,它是一个包装器axios.request
.
我发送一个消息类型和配置,以便我可以创建一个新的消息response.data
.
我有多种类型的消息,所以我创建了一个泛型TMessage
类型来处理这个:
public request>( config: Axios.AxiosXHRConfig , messageType: {new (message: string): TMessage} ): Promise { return new Promise((resolve, reject) => { axios.request(config).then((response: Axios.AxiosXHR ) => { 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中有没有办法做到这一点?以下代码使用联合类型和编译,但它不强制使用messageType来匹配返回类型,这使得它有点多余.
Promise
如果提供了messageType,我想要一个返回类型.否则我想要一个Promise
返回类型
public request>( config: Axios.AxiosXHRConfig , messageType?: {new (message: string): TMessage} ): Promise > { ...
-
RestClient.request(config, SomeMessage).then((response: OtherMessage) => { // this compiles, ideally it should complain about the mismatch of message types resolve(response); });
Nitzan Tomer.. 5
您可以为方法定义不同的签名:
public request>( config: Axios.AxiosXHRConfig , messageType: {new (message: string): TMessage} ): Promise ; public request( config: Axios.AxiosXHRConfig ): Promise >; public request >( config: Axios.AxiosXHRConfig , messageType?: {new (message: string): TMessage} ) { ... }
此文档的重载部分中描述了此功能:
JavaScript本质上是一种非常动态的语言.单个JavaScript函数根据传入的参数的形状返回不同类型的对象并不罕见
链接中的更多信息.
您可以为方法定义不同的签名:
public request>( config: Axios.AxiosXHRConfig , messageType: {new (message: string): TMessage} ): Promise ; public request( config: Axios.AxiosXHRConfig ): Promise >; public request >( config: Axios.AxiosXHRConfig , messageType?: {new (message: string): TMessage} ) { ... }
此文档的重载部分中描述了此功能:
JavaScript本质上是一种非常动态的语言.单个JavaScript函数根据传入的参数的形状返回不同类型的对象并不罕见
链接中的更多信息.