如何在Typescript中基于另一个类型创建联合类型?

b5buobof  于 2023-03-19  发布在  TypeScript
关注(0)|答案(2)|浏览(119)

我有这种类型

type ListingFilterBy = {
  season?: string[];
  name?: string;
  isOnMarket?: boolean;
};

我想创建一个基于ListingFilterBy类型的联合类型,如下所示:

type FilterAction =
  | { key: "season"; value: string[] }
  | { key: "name"; value: string }
  | { key: "isOnMarket"; value: boolean };

是否有办法创建一个类型,使TS编译器知道FilterAction类型中的key字段是ListingFilterBy类型的键?

ttisahbt

ttisahbt1#

这应该行得通:

type ListingFilterBy = {
  season?: string[];
  name?: string;
  isOnMarket?: boolean;
};

type FilterActionMap = {
  season: string[];
  name: string;
  isOnMarket: boolean;
};

type Unionize<T> =  Exclude<{
  [K in keyof T]: K extends keyof T
    ? { key: K, value: T[K] }
    : never;
}[keyof T], undefined>;

type UnionizedFilterAction = Unionize<ListingFilterBy>;
igetnqfo

igetnqfo2#

MapListingFilterBy的每个键,删除undefined

type FilterAction = {
  [K in keyof ListingFilterBy]-?: { key: K ; value: Exclude<ListingFilterBy[K], undefined> };
}[keyof ListingFilterBy];

然后使用keyof ListingFilterBy得到最终的并集。
Playground
如果您还想删除null,也可以使用NonNullable<ListingFilterBy[K]>

相关问题