首页 > 解决方案 > 新类型,它是父类型上每个键的值的联合

问题描述

所以我想生成一个类型,即使用类型组合上的所有可能键合并所有可能值。很难说这个,所以最好表现出来。

所以这是我的例子

type A = {
  page: string,
  other: number,
}

type B = {
  obj: {
    something: string
  }
  page: string,
}

export type AllViews = {
  a: A;
  b: B;
};

export type View = keyof AllViews;

type KeysOfUnion<T> = T extends T ? keyof T : never;

type AllTypes = AllViews[View];
type AllTypeKeys = KeysOfUnion<AllTypes>;

你可以看到AllTypes,是我的两种类型 A 和 B 的并集 在此处输入图像描述

而 myAllTypeKeys是这两种类型之间所有可能键的联合。 在此处输入图像描述

所以这就是我的问题所在。我想要一种新类型,即两个对象的所有键的所有可能值。在这种情况下,类型应该是string | number | { something: string }

目前我能想到的唯一方法是非常手动。

type AType = AllViews['a'];
type AKeyType = keyof AllViews['a'];
type AValueType = AType[AKeyType];

type BType = AllViews['b'];
type BKeyType = keyof AllViews['b'];
type BValueType = BType[BKeyType];

type AllValues = AValueType | BValueType;

我的最终结果是这样的。 在此处输入图像描述

我的代码最终将在父类型上包含几十个这样的新类型,我不想为我添加的每个新键/值手动添加它。

标签: typescript

解决方案


除非我误解了这个问题,否则您需要做的就是创建一个泛型类型:

  type All<T> = T[keyof T]

然后将其与现有类型的结合使用,例如

type AllValues = All<A&B> // string | number | { something: string }

[回应评论更新]:

不必显式列出该A&B部分需要一个额外的泛型类型:

type All2<T> = {[K in keyof T]: All<T[K]>}; // I suck at naming things
type AllValues = All<All2<AllViews>>; // string | number | { something: string }

推荐阅读