复杂类型推断。很确定这在 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];
}