首页 > 解决方案 > Typescript:将 Type 映射到 RawType,并回退到 Type

问题描述

我有一个类型的集合。如果存在特定类型的原始类型,我希望其中一些映射到原始类型。否则应该使用 Type 本身。

我努力了:

type RawTypes = {
  MyTypeA: MyTypeARaw,
  // MyTypeB: Use MyTypeB
  MyTypeC: Partial<MyTypeC>,
  // MyTypeD: Use MyTypeD
  MyTypeE: DeepPartial<MyTypeE>,
  MyTypeF: Omit<MyTypeF, "extended">,
};

export type MappedType<T> = T extends keyof RawTypes ? RawTypes[T] : T;

// How I want to use it:
let a: MappedType<MyTypeA>;

这不起作用,因为 RawTypes 的键是字符串。

// Using a string-literal makes mapped type work
let a: MappedType<"MyTypeA">;
// Using of type makes fallback-version work
let b: MappedType<MyTypeB>;

它仅用于编译时类型检查。

有没有办法做到这一点?

标签: typescript

解决方案


我去跑步,这让我头脑清醒,我想出了这个解决方案:

export type MappedType<T> =
  T extends MyTypeA ? MyTypeARaw :
  // MyTypeB: Use MyTypeB
  T extends MyTypeC ? Partial<MyTypeC> :
  // MyTypeD: Use MyTypeD
  T extends MyTypeE ? DeepPartial<MyTypeE> :
  T extends MyTypeF ? Omit<MyTypeF, "extended"> :
  T;

现在我可以将它们用于:

let a: MappedType<MyTypeA>; // Will be MyTypeARaw
let b: MappedType<MyTypeB>; // Will be MyTypeB

推荐阅读