typescript - 将数组值约束到接口的键
问题描述
我试图将数组的值限制为接口的特定键:
interface Foo {
bar: string;
baz: number;
foo: string;
}
type ExtractArrayOfKeys<T, K extends keyof T> = Pick<T, K>[];
const keyArray: ExtractArrayOfKeys<Foo, "bar" | "baz"> = ["bar", "baz"]; // Error: Type 'string' is not assignable to type 'Pick<Foo, "bar" | "baz">'
解决方案
这可以使用Extract实用程序类型相对轻松地完成,例如
type AllFoo = keyof Foo
type BarBaz = Extract<keyof Foo, 'bar' | 'baz'>
const allFooOK: AllFoo[] = ['bar', 'baz', 'foo']
const allFooNotOK: AllFoo[] = ['bar', 'kek'] // Type '"kek"' is not assignable to type '"bar" | "baz" | "foo"'
const barBazOK: BarBaz[] = ['bar', 'baz']
const barBazNotOK: BarBaz[] = ['bar', 'foo'] // Type '"foo"' is not assignable to type '"bar" | "baz"'.