关于ts的条件类型

怎么处理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);
阅读 1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进