我正在尝试创建一个类型安全的映射函数(不是下面的函数),但我坚持让函数参数正确推断。
export type Mapper<U extends Unmapped> = {
mapped: Mapped<U>
};
export type Unmapped = {
[name: string]: (...args: any[]) => any
};
export type Mapped<U extends Unmapped> = {
[N in keyof U]: (...args: any[]) => Promise<any>
};
const map = <U extends Unmapped>(unmapped: U): Mapper<U> => ({
mapped: Object.entries(unmapped).reduce(
(previous, [key, value]) => ({
...previous,
[key]: (...args: any[]) => new Promise((resolve) => resolve(value(...args)))
}),
{}
) as Mapped<U>
});
const mapped = map({ test: (test: number) => test });
mapped.mapped.test('oh no');
是否可以让 TypeScript 推断它们?目前里面的功能mapped
对象接受任何参数,但它应该只接受未映射对象中定义的参数。函数名称确实可以正确推断。
Can use Parameters
and ReturnType
泛型类型获取函数的具体参数和返回类型:
type Promisified<T extends (...args: any[]) => any> = (...args: Parameters<T>) => Promise<ReturnType<T>>;
export type Mapped<U extends Unmapped> = {
[N in keyof U]: Promisified<U[N]>
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)