我正在尝试创建一种类型,将记录转换为其键的所有类型的联合。
给定以下类型:
type Foo = { key1: { bar: '1' }; key2: { bar: '2' }; key3: { bar: '3' }; }
我想创建一个KeysTypeUnion<T>验证的类型:
KeysTypeUnion<T>
KeysTypeUnion<Foo> == { bar: '1' } | { bar: '2' } | { bar: '3' }
我只能手写如下:
FooKeysTypeUnion = typeof Foo.key1 | typeof Foo.key2 | typeof Foo.key3
但创建类型别名会有助于节省时间。
KeysTypeUnion<{ key1: '1'; key2: '2'; key3: '3' }> == '1' | '2' | '3' KeysTypeUnion<Record<string, A | B | C>> == A | B | C
您可以使用索引类型和keyof关键字来实现您想要的功能。下面是一个实现示例:
keyof
// 定义一个类型,它接受一个泛型T,并返回T的所有值的联合类型 type ValuesOf<T> = T[keyof T]; // 定义一个类型,它接受一个泛型T,并返回T的所有值的联合类型 type KeysTypeUnion<T> = ValuesOf<T>; // 测试示例 type Foo = { key1: { bar: '1' }; key2: { bar: '2' }; key3: { bar: '3' }; } type Test1 = KeysTypeUnion<Foo>; // { bar: '1' } | { bar: '2' } | { bar: '3' } type Test2 = KeysTypeUnion<{ key1: '1'; key2: '2'; key3: '3' }>; // '1' | '2' | '3' type A = { a: string }; type B = { b: string }; type C = { c: string }; type Test3 = KeysTypeUnion<Record<string, A | B | C>>; // A | B | C
在这个实现中,ValuesOf<T>类型接受一个泛型T,然后使用keyof T获取T的所有键的联合类型,并将其传递给索引类型T[keyof T],从而获得T的所有值的联合类型。然后,KeysTypeUnion<T>类型接受一个泛型T,并使用ValuesOf<T>来获取T的所有值的联合类型。
ValuesOf<T>
T
keyof T
T[keyof T]