首页 > 解决方案 > TypeScript:如何显示所有类型成员而不是高阶类型

问题描述

我在我的项目中创建了一些映射类型,并且我确定它们工作正常,但是可以更容易地查看类型显式映射到的内容。

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

type RequiredKeys<T> =  Exclude<keyof T, OptionalKeys<T>>;

interface Foo {
  a: Date;
  b?: Date;
}

type StringFoo = (
  Partial<Record<OptionalKeys<Foo>, string> &
  Record<RequiredKeys<Foo, string>>
);

这很好用,除非当我将鼠标悬停在类型上进行检查时,这就是我所看到的

type StringFoo = Partial<Record<"b", string>> & Record<"a", string>

这有点不透明。有没有办法让它显示为这个?

type StringFoo = {
  b?: string;
} & {
  a: string;
}

谢谢!

标签: typescript

解决方案


使用带有索引签名而不是Record类型的大括号:

type StringFoo = (
  {[key in OptionalKeys<Foo>]?: string} & 
  {[key in RequiredKeys<Foo>]: string}
);

// {
//     b?: string | undefined;
// } & {
//     a: string;
// }

推荐阅读