小能豆

如何在 Typescipt 中创建记录键类型的联合类型?

js

我正在尝试创建一种类型,将记录转换为其键的所有类型的联合。

例子:

给定以下类型:

type Foo = {
    key1: { bar: '1' };
    key2: { bar: '2' };
    key3: { bar: '3' };
}

我想创建一个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

阅读 207

收藏
2024-02-23

共1个答案

小能豆

您可以使用索引类型和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的所有值的联合类型。

2024-02-23