请考虑以下声明:
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>
如何正确键入返回值?
答案 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>
希望这可以为您提供帮助