typescript 创建具有Map属性的动态联合类型

bogh5gae  于 2022-12-05  发布在  TypeScript
关注(0)|答案(1)|浏览(152)

我有以下类型

enum Types {
  Email = 'email',
  Checkbox = 'checkbox',
}

type MappedValues = {
  [Types.Email]: string;
  [Types.Checkbox]: boolean;
};

type T1<T extends Types> = { type: T } & {
  [key in T]: MappedValues[T];
};

type T2 = T1<Types.Email | Types.Checkbox>

用上面的例子T2是:

{
  type: 'email' | 'checkbox',
  email: string,
  checkbox: boolean
}

但我在寻找:

{
  type: 'email',
  email: string
} | {
  type: 'checkbox',
  checkbox: boolean
}

我浏览了整个关于打字的打字脚本文档,发现了很多有趣的东西,但没有关于我的具体情况。
是否可以这样做,或者我必须更改我的基类型(TypesMappedValues)?

mrphzbgm

mrphzbgm1#

可以创建具有所有可能值的类型:

type T1<T extends Types> = {
  [key in T]: {
    type: key,
    data: MappedValues[key]
  }
}

type T2 = T1<Types.Email | Types.Checkbox>

其中T2为:

{
  email: {
    type: 'email',
    data: string
  },
  checkbox: {
    type: 'checkbox',
    data: boolean
  }
}

然后,您可以使用泛型来索引此Map,以将其转换为并集:

type T1<T extends Types> = {
  [key in T as string]: {
    type: key;
  } & {
    [property in key]: MappedValues[key];
  };
}[T];

T2变为:

({
    type: Types.Email;
} & {
    email: string;
}) | ({
    type: Types.Checkbox;
} & {
    checkbox: boolean;
})

相关问题