如何在打字稿中创建从联合类型派生的类型

How to create a type derived from an union type in typescript

我有以下类型

type DataTableCol<T, K extends keyof T> = {
  title: string;
  key: K;
  render?: (value: T[K]) => ReactElement;
};

我需要创建另一种类型,DataTableRow<T>,派生自它。从 type MyData = { name: string; value: number; } 开始,它将具有以下形式:

type DataTableRow<MyData> = (DataTableCol<MyData, 'name'> | DataTableCol<MyData, 'value'>)[]

它基本上是一个新联合类型的数组,映射到 T 的每个键,我想使用泛型,因为这段代码将是可重用的。 这可能吗?

您可以使用 distributive conditional type:

type DataTableCol<T, K extends keyof T> = {
  title: string;
  key: K;
  render?: (value: T[K]) => any;
};

type Distribute<T, K> = K extends keyof T ? DataTableCol<T, K> : never;

type DataTableRow<T> = (Distribute<T, keyof T>)[];

type MyData = { name: string; value: number; };

type Foo = DataTableRow<MyData>;
// (DataTableCol<MyData, "name"> | DataTableCol<MyData, "value">)[]

Playground