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

时间:2017-01-17 14:48:21

标签: reactjs typescript axios

我有一个函数,它是axios.request的包装器。

我发送一个Message类型和config,以便我可以使用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和compiles,但它没有强制使用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);
});

1 个答案:

答案 0 :(得分:5)

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

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Directives._
import akka.stream.ActorMaterializer

import scala.io.StdIn

object MainRunner extends App {

  implicit val system = ActorSystem("mySystem")
  implicit val materializer = ActorMaterializer
  implicit val ec = system.dispatcher

  val route =
    path("hello") {
      get {
        complete("Congratulation , this is your response")
      }
    }

  val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)

  println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
  StdIn.readLine() // let it run until user presses return
  bindingFuture
    .flatMap(_.unbind()) // trigger unbinding from the port
    .onComplete(_ => system.terminate()) // and shutdown when done
}

修改

此功能在文档的Overloads部分中进行了描述:

  

JavaScript本质上是一种非常动态的语言。这并不罕见   用于单个JavaScript函数以返回不同类型的对象   基于

中传递的参数的形状

链接中的更多信息。