代码:
const action = {
'/posts': () => Promise.resolve(['a']),
'/test': () => Promise.resolve([1]),
} as const;
type test = ReturnType<ActionType['/test']>;
async function getData<T extends ItemKey>(url: T) {
return await action[url]();
}
type ActionType = typeof action;
type ItemKey = keyof typeof action;
const post = getData('/posts'); // Promise<string[]>
const test = getData('/test'); // Promise<number[]>
结果:
- 传入
'/posts'
拿到Promise<string[]>
- 传入
'/test'
拿到Promise<number[]>
前置条件:
- 尽可能不要强行断言
尝试了一下
传送门:http://u5a.cn/qcTA9
尝试的时候遇到些问题:
Promise<?>
,没办法,只好先DePromise
之后再把Promise
加上。await action[url]()
自动推导出来的类型是number[] | string[]
,所以只好用as InferResult<T>
强制声明类型。