TS类型体操练手记录 -- 字符串篇

122 阅读1分钟

基础定义

type InputType = string | number | bigint | boolean | null | undefined;

字符串基本操作

StringAdd

type StringAdd<T extends InputType[] = []> = T extends [
  infer S extends InputType,
  ...infer Rest extends InputType[],
]
  ? `${S}${StringAdd<Rest>}`
  : ``;

StringLength

type StringLength<
  S extends InputType,
  Rest extends InputType[] = [],
> = `${S}` extends `${infer L}${infer R}`
  ? StringLength<R, [...Rest, L]>
  : Rest['length'];

StringToArray

type StringToArray<
  S extends InputType,
  Rest extends string[] = [],
> = `${S}` extends `${infer L}${infer R}`
  ? StringToArray<R, [...Rest, L]>
  : Rest;

StringToUniqueArray

type StringToUniqueArray<
  S extends InputType,
  Rest extends string[] = [],
  Temp extends string = never,
> = `${S}` extends `${infer L}${infer R}`
  ? L extends Temp
    ? StringToUniqueArray<R, Rest, Temp>
    : StringToUniqueArray<R, [...Rest, L], Temp | L>
  : Rest;

StringReverse

type StringReverse<S extends string> = S extends `${infer C}${infer Rest}`
  ? `${StringReverse<Rest>}${C}`
  : `${S}`;

StringToKeySet

type StringToKeySet<
  S extends InputType,
  Rest extends InputType[] = [],
  Temp extends string = never,
> = `${S}` extends `${infer L}${infer R}`
  ? L extends Temp
    ? StringToKeySet<R, Rest, Temp>
    : StringToKeySet<R, [...Rest, L], Temp | L>
  : Temp;

StringCharCount

type StringCharCount<
  S extends InputType,
  F extends InputType = S,
  CountObject extends Record<StringToKeySet<F>, InputType[]> = {
    [key in StringToKeySet<F>]: [];
  },
> = `${S}` extends `${infer L}${infer R}`
  ? StringCharCount<
      R,
      F,
      {
        [key in StringToKeySet<F>]: L extends key
          ? [...CountObject[key], L]
          : CountObject[key];
      }
    >
  : {
      [key in StringToKeySet<F>]: CountObject[key]['length'];
    };

StringIsChar

type StringIsChar<S extends string> = 1 extends StringToArray<S>['length']
  ? true
  : false;

字符串替换

StringReplace

type StringReplace<
  S extends InputType,
  P extends InputType,
  T extends InputType,
> = `${S}` extends `${infer LeftRest}${P}${infer RightRest}`
  ? `${LeftRest}${T}${RightRest}`
  : `${S}`;

StringReplaceAll

type StringReplaceAll<
  S extends InputType,
  P extends InputType,
  T extends InputType,
> = `${S}` extends `${infer LeftRest}${P}${infer RightRest}`
  ? `${StringReplaceAll<LeftRest, P, T>}${T}${StringReplaceAll<
      RightRest,
      P,
      T
    >}`
  : `${S}`;

字符串trim相关

StringLeftTrim

type StringLeftTrim<S extends InputType> = `${S}` extends ` ${infer Rest}`
  ? `${StringLeftTrim<Rest>}`
  : S;

StringRightTrim

type StringRightTrim<S extends InputType> = `${S}` extends `${infer Rest} `
  ? `${StringRightTrim<Rest>}`
  : S;

StringTrim

type StringTrim<S extends InputType> = StringLeftTrim<StringRightTrim<S>>;

字符串查找相关

StringStartsWith

type StringStartsWith<
  T extends InputType,
  P extends InputType,
> = `${T}` extends `${P}${infer _}` ? T : never;

StringEndsWith

type StringEndsWith<
  T extends InputType,
  P extends InputType,
> = `${T}` extends `${infer _}${P}` ? T : never;

StringIncludes

type StringIncludes<
  T extends InputType,
  P extends InputType,
> = `${T}` extends `${infer _1}${P}${infer _2}` ? T : never;