套路二:重新构造做变换

· words · 1 min

Capitalize

利用 ts 自带的 Uppercase 工具类型。

type Capitalize<S extends string> =
  S extends `${infer First}${infer Rest}`
    ? `${Uppercase<First>}${Rest}`
    : S;

type result = Capitalize<'captainOfPhB'>; // CaptainOfPhB

FilterByValueType

never 的索引会在生成新的索引类型时被去掉。

type FilterByValueType<Obj extends Record<string, any>, ValueType> = {
  [Key in keyof Obj as ValueType extends Obj[Key] ? Key : never] : Obj[Key]
}

interface Person {
  name: string;
  age: number;
  hobby: string[];
}

type result = FilterByValueType<Person, string | number>; // { name: string; age: number }

isEqual

type IsEqual<A, B> = (A extends B ? 1 : 2) extends (B extends A ? 1 : 2) ? true : false;

BuildArray

type BuildArray<Length extends number, Ele = unknown, Arr extends unknown[] = []> =
  Arr['length'] extends Length
    ? Arr 
    : BuildArray<Length, Ele, [...Arr, Ele]>;

type result = BuildArray<3>; // [unknown, unknown, unknown]