怎么处理promise的类型 (用条件类型 不用函数重载)
(ts新手 虽然api没啥意义 就想练习一下处理类型)
type Params = Record<string, unknown>;
type UrlParamsTuple<T, U> = U extends Params ? [T, U] : [T]; // 条件类型怎么弄(不用函数重载)
function hasParams(param: unknown[]): param is [string, Params] { // 类型谓词也不是很明白
return param[1] instanceof Object;
}
function promiseRequest<T extends string, U>(url: T, params?: U): Promise<UrlParamsTuple<T,U>> {
return new Promise((resolve) => {
setTimeout(() => {
const result = params instanceof Object ? [url, params] : [url];
hasParams(result);
resolve(result); // 报错
}, 2000);
});
}
const p1 = promiseRequest('http://', { id: 111 }); // 第一参数是字符串 第二个参数是普通对象或不传 (p1可根据参数 推断Promise传的参数的类型 比如元组[string,Params])
const p2 = promiseRequest('http://');
p1.then(console.log);
p2.then(console.log);