搜索

[Typescript] Tips: Assign local variables to default generic slots to dry up your code and improve performance


发布时间: 2022-11-24 18:27:04    浏览次数:51 次

You can DRY up your generics code MASSIVELY (and improve perf) by assigning local variables to default generic slots.

Here, we move some complex 'Extract' logic to a generic slot, meaning it only gets calculated once.

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

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

type x = ValuewOfKeysStartingWithA<Obj> // "a" | "a2" | "a3"

 

Notice that we repeat Extract<keyof Obj, `a${string}`>twice.

What we can do better:

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

 

 

Extract to more generic type:

export type Obj = {
  a: "a";
  a2: "a2";
  a3: "a3";
  b: "b";
  b1: "b1";
  b2: "b2";
  12: "12";
};

type KeyStartsWith<
  Obj extends Record<PropertyKey, any>,
  Matcher extends string | number | symbol,
  _ExtractedKey extends keyof Obj = Extract<keyof Obj, Matcher>
> = {
  [K in _ExtractedKey]: Obj[K];
}[_ExtractedKey];

type KeyStartsWithA = KeyStartsWith<Obj, `a${string}`>; // "a" | "a2" | "a3"
type KeyStartsWithNumber = KeyStartsWith<Obj, number>; // "12"
type KeyStartsWithNumber2 = KeyStartsWith<[123, 321], number>; // 123 | 321

 

免责声明 [Typescript] Tips: Assign local variables to default generic slots to dry up your code and improve performance,资源类别:文本, 浏览次数:51 次, 文件大小:-- , 由本站蜘蛛搜索收录2022-11-24 06:27:04。此页面由程序自动采集,只作交流和学习使用,本站不储存任何资源文件,如有侵权内容请联系我们举报删除, 感谢您对本站的支持。 原文链接:https://www.cnblogs.com/Answer1215/p/16809744.html