Невозможно ввести универсальные шаблоны в метод Typescript без потери типизации ключей объекта - PullRequest
1 голос
/ 29 мая 2020

Я создаю метод в Typescript, который извлекает допустимые типы свойств из объекта ограниченного типа c.

По сути, у меня есть тип ParticipantBase, который имеет свойства first: string, last: string, extras: [key: string]: string. Я создал функцию getAllowedEntry, которая принимает объект типа ParticipantBase и ключ, по которому значение в объекте ParticipantBase имеет тип AllowableType. Это прекрасно работает.

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

Я думаю, здесь есть что-то фундаментальное, чего я не понимаю в типах и обобщениях в Typescript, если бы кто-то мог мне помочь, это было бы здорово.

Минимальный образец (также доступен в детская площадка ):

type PropertiesOfType<U, V> = {
  [P in keyof U]: U[P] extends V ? P : never;
}[keyof U];

type AllowedPropertyTypes = string | number;

type ParticipantBase = {
  first: string;
  last: string;
  extras: { [property: string]: string };
};

// Doesn't work.
function getAllowedEntry<T, K extends PropertiesOfType<T, AllowedPropertyTypes>>(participant: T, key: K): AllowedPropertyTypes {
  return participant[key];
}

// Works just fine.
function getAllowedParticipantEntry<K extends PropertiesOfType<ParticipantBase, AllowedPropertyTypes>>(participant: ParticipantBase, key: K): AllowedPropertyTypes {
  return participant[key];
}

1 Ответ

2 голосов
/ 29 мая 2020

Следует заменить тип возвращаемого значения с AllowedPropertyTypes на T [K]

Подсказка об ошибке: введите 'T [ K] 'не может быть назначен типу' AllowedPropertyTypes '.

function getAllowedEntry<T, K extends PropertiesOfType<T, AllowedPropertyTypes>>(participant: T, key: K): T[K] {
      return participant[key];
    }
...