@Cruper
web-падаван

Как типизировать массив ключей интерфейса?

interface Interface {
  foo: boolean;
  bar: string;
  baz: object
}

type Keys = KeysOfInterface<Interface>;

let keys: Keys;

keys = ['foo', 'bar', 'baz']; // OK все ключи указаны
keys = ['foo']; // NOT OK указаны не все ключи
keys = ['foo', 'bar', 'another bar']; // NOT OK один из ключей не совпадает


keyof возвращает Union ключей и не выбрасывает исключение, если одного из значений не хватает
  • Вопрос задан
  • 394 просмотра
Пригласить эксперта
Ответы на вопрос 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
Тут есть несколько решений.
Например:
type TupleUnion<U extends string, R extends string[] = []> = {
	[S in U]: Exclude<U, S> extends never ? [...R, S] : TupleUnion<Exclude<U, S>, [...R, S]>;
}[U] & string[];

interface Interface {
  foo: boolean;
  bar: string;
  baz: object
}

type Keys = TupleUnion<keyof Interface>; 

let keys: Keys;

keys = ['foo', 'bar', 'baz']; // OK все ключи указаны
keys = ['foo']; // NOT OK указаны не все ключи
keys = ['foo', 'bar', 'another bar']; // NOT OK один из ключей не совпадает

Но в реальном проекте их использовать крайне не рекомендуется - они сожрут тебе всю память и весь процессор, если ключей будет побольше чем парочка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы