Как получить Typescript для вывода определенного типа c из вызова Array.map из списка типов generi c? - PullRequest
0 голосов
/ 20 апреля 2020

Работает следующий код:

interface Model {
  keyFromModel: string;
  anotherKeyFromModel: number;
}
export const getKeyLoader = <T, K extends keyof T>(model: mongoose.Model<T & mongoose.Document>, key: K, one: boolean) => {
  type inputType = NonNullable<T[K]>; // this becomes type "string"
}

Я могу назвать это так

getKeyLoader(model, "keyFromModel", true).load()

... и тип K - "keyFromModel".

Однако я хочу, чтобы параметр loaders принимал массив ключей из интерфейса модели.

export const getLoadersForModel = <T, K extends keyof T>(model: mongoose.Model<T & mongoose.Document>, loaders: K[]) => {
  const dataLoaders = loaders.map((key) => { // key is inferred as keyof T
      const test = getKeyLoader(model, key, true);
      return test;
  });
}
/// ... in getKeyLoader ...
// type inputType = NonNullable<T[K]>; // K becomes a union of all `keyof T ` and inputType becomes `any`

Вместо этого полный набор объединений типа keyof Model передается в getKeyLoader, тогда как я просто хочу ключ в этой итерации вызова Array.map и строкового литерала.

1 Ответ

0 голосов
/ 20 апреля 2020

Очевидно, у меня была другая функция-обертка, о которой я забыл:

<T>(name: string, types: string, loaders: (keyof T)[]) => {
  ...getKeyLoader(...)
}

Я изменил ее на эту, чтобы решить проблему:

<T, K extends keyof T>(name: string, types: string, loaders: K[])
...