typescript 如何从另一个类型派生一个有区别的联合?

fjaof16o  于 2023-02-17  发布在  TypeScript
关注(0)|答案(1)|浏览(142)

假设我们有一个类型为

const originalObj = { foo: 'fooVal', bar: 'barVal' };

如何编写一个实用程序类型来从原始对象创建一个有区别的联合体,以便每个成员看起来像

type Sample1 = {
  header: string;
  accessor: 'foo' //discriminant
  render?: (value: 'fooVal', original: typeof originalObj) => React.ReactNode;
};

type Sample2 = {
  header: string;
  accessor: 'bar' //discriminant
  render?: (value: 'barVal', original: typeof originalObj) => React.ReactNode;
};

如果手动创建,所需内容将如下所示

type OriginalObjMappedToUnIonOfSamples = Sample1 | Sample2;

如何编写一个helper,在只给出原始对象类型的情况下自动为我创建这个对象?

type WhatIWant = GetDiscriminatedUnionOfSamples<typeof originalObj>;
fnatzsnv

fnatzsnv1#

您可以使用 mapped typeoriginalObj中的每个键Map到其对应的对象类型。使用keyof T索引结果将生成您要查找的结果。

type GetDiscriminatedUnionOfSamples<T> = {
  [K in keyof T]: {
    header: string;
    accessor: K;
    render?: (value: T[K], original: typeof originalObj) => React.ReactNode;
  };
}[keyof T];

Playground

相关问题