Как использовать ключи типа как значения?

Рейтинг: 1Ответов: 1Опубликовано: 01.02.2023

Подскажите пожалуйста, как можно воспользоваться ключами типа как значениями? к примеру:

interface Test {
  name1: string;
  name2: string;
  name3: string;
}

function test(name: вот тут нужно передать либо 'name1', либо 'name2', по сути можно сделать 'name1' | 'name2', но это как-то хардкодно выглядит) {}

Ответы

▲ 3Принят
interface Test {
  name1: string;
  name2: string;
  name3: string;
}

function test(n: keyof Test) {
    if (n === "name1") {} // ok
    if (n === "non-exising") {} // error
}

Это в случае если любой ключ типа Test должен подходить. Если некоторые (например name3) нужно отбросить, то можно воспользоваться Omit:

interface Test {
  name1: string;
  name2: string;
  name3: string;
}

function test(n: keyof Omit<Test, "name3">) {
    if (n === "name1") {} // ok
    if (n === "name3") {} // error
}

Если же вы не хотите перечислять вручную все отбрасываемые значение, а вместо этого хотите наоборот передать только подходящие, то поможет Pick:

interface Test {
  name1: string;
  name2: string;
  name3: string;
}

function test(n: keyof Pick<Test, ("name1" | "name2")>) {
    if (n === "name1") {} // ok
    if (n === "name3") {} // error
}

Но в таком случае вы особо не выигрываете по сравнению с "name1" | "name2". Единственный плюс последнего решения над строковым юнионом - это что вы не сможете допустить опечатку при перечислении всех подходящих ключей.