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"
. Единственный плюс последнего решения над строковым юнионом - это что вы не сможете допустить опечатку при перечислении всех подходящих ключей.