复杂类型推断。很确定这在 TS 中是可能的,但是
Complex type infer. Quite sure it's possible in TS, but
遇到一个非常有趣的问题,我真的无法解决。
我想创建一个接受函数对象的函数,并且 return 是一个具有相同键但 return 类型不同的对象(return 类型取决于参数的值。
例如:
declare function add(a: number, b: number): number
declare function str(a: string, b: string): string
declare function createObject(obj)
const result = createObject({
addFn: add,
strFn: str
})
/*
result's TYPE should equal:
{
addFn: [number, (a: number, b: number) => number],
strFn: [string, (a: string, b: string) => string]
}
*/
在我看来,这看起来可以解决,但我不确定如何解决。最接近我的解决方案的是下一行:
type GenericHashTable<T> = { [key in keyof T]: T[key] };
function createAPI<T extends { [k: string]: any }>(fetchers: T) {
const obj: GenericHashTable<T> = fetchers;
return obj;
}
但是这个声明不允许我正确更改 return 类型。
看来您只需要预定义的 ReturnType
条件类型:
declare function add(a: number, b: number): number
declare function str(a: string, b: string): string
type GenericHashTable<T extends Record<keyof T, (...a: any[]) => any>> = { [key in keyof T]: [ReturnType<T[key]>, T[key]] };
declare function createAPI<T extends Record<keyof T, (...a: any[]) => any>>(fetchers: T): GenericHashTable<T>;
const result = createAPI({
addFn: add,
strFn: str
})
// Same as
const result: {
addFn: [number, (a: number, b: number) => number];
strFn: [string, (a: string, b: string) => string];
}
遇到一个非常有趣的问题,我真的无法解决。
我想创建一个接受函数对象的函数,并且 return 是一个具有相同键但 return 类型不同的对象(return 类型取决于参数的值。
例如:
declare function add(a: number, b: number): number
declare function str(a: string, b: string): string
declare function createObject(obj)
const result = createObject({
addFn: add,
strFn: str
})
/*
result's TYPE should equal:
{
addFn: [number, (a: number, b: number) => number],
strFn: [string, (a: string, b: string) => string]
}
*/
在我看来,这看起来可以解决,但我不确定如何解决。最接近我的解决方案的是下一行:
type GenericHashTable<T> = { [key in keyof T]: T[key] };
function createAPI<T extends { [k: string]: any }>(fetchers: T) {
const obj: GenericHashTable<T> = fetchers;
return obj;
}
但是这个声明不允许我正确更改 return 类型。
看来您只需要预定义的 ReturnType
条件类型:
declare function add(a: number, b: number): number
declare function str(a: string, b: string): string
type GenericHashTable<T extends Record<keyof T, (...a: any[]) => any>> = { [key in keyof T]: [ReturnType<T[key]>, T[key]] };
declare function createAPI<T extends Record<keyof T, (...a: any[]) => any>>(fetchers: T): GenericHashTable<T>;
const result = createAPI({
addFn: add,
strFn: str
})
// Same as
const result: {
addFn: [number, (a: number, b: number) => number];
strFn: [string, (a: string, b: string) => string];
}