用局部变量来减少重复代码

我们可以通过将局部变量分配给默认泛型槽,将减少重复代码并提高性能。 这边有一段示例代码:

export type Obj = {
  a: "a",
  a2: "a2",
  a3: "a3",
  b: "b",
  b2: "b2",
  b3: "b3",
}

type ValueOfKeysWithA<Obj> = {
  [K in Extract<keyof Obj, `a${string}`>]: Obj[K];
}[Extract<keyof Obj, `a${string}`>]

type NewUnion = ValueOfKeysWithA<Obj>

试一试

剧透预警线

我们可以看到其中有两处都用到了Extract<keyof Obj, `a${string}`> 这样会有两个问题,首先是重复代码,其次是Extract会执行两次,影响性能。 所以我们可以尝试把它作为局部变量的默认值来处理:

export type Obj = {
  a: "a",
  a2: "a2",
  a3: "a3",
  b: "b",
  b2: "b2",
  b3: "b3",
}

type ValueOfKeysWithA<Obj, ExtractKeys extends keyof Obj = Extract<keyof Obj, `a${string}`>> = {
  [K in ExtractKeys]: Obj[K];
}[ExtractKeys]

type NewUnion = ValueOfKeysWithA<Obj>

试一试