Комплексный тип Вполне возможно, что это возможно в TS, но - PullRequest
1 голос
/ 06 июля 2019

есть довольно интересная проблема, которую я не могу решить на самом деле.

Я хочу создать функцию, которая принимает объект функций и возвращает объект с теми же ключами, но с другим типом возврата (тип возврата THEзависит от значения аргумента.

Например:

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;
}

Но этот decl не позволит мне правильно изменить тип возвращаемого значения.

1 Ответ

1 голос
/ 06 июля 2019

Похоже, вам просто нужен предопределенный условный тип 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...