基于函数头的条件返回类型

时间:2019-06-04 11:19:01

标签: typescript generics

请考虑以下声明:

interface Config {
   //...
}

type RequestConfig<T = any> = string | Config | Promise<T>;

const getData = <T = any, R = any>(cfg: RequestConfig<R>) => {
   //...
}

如果Promise<T>参数的类型为cfg,则此函数返回string;否则返回Promise<R>

我想用TypeScript描述返回类型。我走得越近:

const getData = 
   <T = any, R extends RequestConfig = any>(cfg: R):
      R extends Promise<infer U> ? Promise<U> : Promise<T>=> {
      //...
  }

正确键入以下呼叫:

const d2 = getData(new Promise<number>((resolve, reject) => { resolve(5);})); // Promise<number>
const d3 = getData("bla"); // Promise<any>

但是,以下内容未键入Promise<boolean>;而是键入为Promise<{}> | Promise<boolean>

const d1 = getData<boolean>("something"); // `Promise<{}> | Promise<boolean>

如何正确键入返回值?

1 个答案:

答案 0 :(得分:1)

您可能需要overloads来完成

interface Config {
  //...
}

function getData<T = any>(cfg: string): Promise<T>
function getData<T>(cfg: Promise<T>): Promise<T>
function getData<T = any, R = any>(cfg: Config): Promise<R>
function getData() {
  // your code
  return Promise.resolve()
}

const d1 = getData<boolean>("something"); // Promise<boolean>
const d2 = getData(new Promise<number>((resolve, reject) => { resolve(5);})); // Promise<number>
const d3 = getData("bla"); // Promise<any>

希望这可以为您提供帮助