当前位置:  开发笔记 > 编程语言 > 正文

基于可选函数参数的不同返回类型 - Typescript

如何解决《基于可选函数参数的不同返回类型-Typescript》经验,为你挑选了1个好方法。

我有一个函数,它是一个包装器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函数根据传入的参数的形状返回不同类型的对象并不罕见

链接中的更多信息.



1> Nitzan Tomer..:

您可以为方法定义不同的签名:

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函数根据传入的参数的形状返回不同类型的对象并不罕见

链接中的更多信息.


@AndrewEisenberg查看我修改后的答案,并附上文档链接
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有