ts学习终结9

43 阅读1分钟
type LengthOfTyple<T extends any[]>=T['length'];
type FirstItem<T extends any[]>= T extend [infer L,...infer R]?L:never;
type Shift<T extends any[]>=T extend [infer L, ...infer R]?R:never
type Push<T extend any[],E>=[...T,E];
                                  F是放翻转结果空数组,是默认值主要看下一个 extends如何翻转,以及如何存放,然后继续值放如并继续递归                  

type ReverseTuple<T extends any[],F extends any[]=[]>=T extends [infer L,...infer R]?ReverseTuple<R,[L,...F]>:F;


type Flat<T extends any[]>=T extends [infer L ,... infer R]?[...(L extends any[]?Flat<L>:[L]),...Flat<R>]:[]


type Repeat<T,I extends number,F extends any[]=[]>=I extends F["length"]?F:Repeat<T,I,[...F,T]>




type Filter<T extends any[],K,F extends any[]>=T extend [ infer L,...inferR ]?Fifer<R,K,[L] extends [ K]?:[...F,L]:F>:F


type isEqueal<T,K,S,F>=[T] extends [K]?[K] extends [T]?keyof K extends keyof T?keyof T extends keyof K?S:F:F:F:F


type FindIndex<T extends any[],I,F extends any[]=[]>=T extends [infer L,...infer R]?isEqual<L,I,F['length'],FindIndex<R,I,[...F,null]>>:never




type TupleToEnum<T extends anh[],I=false>={
    [K in T[number]]:isEqual<I,true,FindIndex<T,K>,K> 

}

type Slice<
  T extends any[],//T是传进来的数组
  SIndex extends number, // 开始索引
  EIndex extends number = T["length"], // 结束索引
  SA extends any[] = [],//SA和SE采用数组,并没有含义,SA计算开始索引的位 EA计算结束索引的位置
  EA extends any[] = [],//
  F extends any[] = []
> = T extends [infer L, ...infer R]? SA["length"] extends SIndex ? EA["length"] extends EIndex?
[...F,L] //这里是到达数据确定的位置后把要截取的数据放入返回数组中
: Slice<R, SIndex, EIndex, SA, [...EA, null], [...F, L]>//如果开始位置到达不变动,加加结束的位置,把R放入检索数组里,继续递归
: Slice<R, SIndex, EIndex, [...SA, null], [...EA, null], F>//两个位置没找到,继续加加吧R的位置放入继续检索的数组里
  : T;


同理可得 先查找开始位置到达下表没,没有就把L放入F继续递归,递归到结束位置找找到了,然后把前面的F展开放入插入的I跟后面之前的旧数据,
type Splice<
  T extends any[], // 传入的数组
  SIndex extends number, // 开始索引
  DCount extends number, // 要删除的个数
  I extends any[] = [], // 插入的内容
  SA extends any[] = [], // 记录是否到达开始索引
  DA extends any[] = [], // 记录是否达到删除的个数
  F extends any[] = [] // 结果集
> = T extends [infer L, ...infer R]
  ? SA["length"] extends SIndex
    ? DA["length"] extends DCount
      ? [...F, ...I, ...T]
      : Splice<R, SIndex, DCount, I, SA, [...DA, null], F>
    : Splice<R, SIndex, DCount, I, [...SA, null], DA, [...F, L]>
  : F;


模板字符串



type MarginOrPading = "padding" | "margin";
type Direction = "left" | "top" | "right" | "bottom";

type Compose = `${MarginOrPading}-${Direction}`;

可以分发一下减少活了

type IColor<S extends string | number | bigint | boolean | null | undefined> =
  `red-${S}`;



type Person = typeof person; // Person -> {re_name:string,re_age:number,re_address:string}

type RePerson<T> = {
  [K in keyof T as `re_${K & string}`]: T[K]; // 重新映射
};

type PersonGetter<T> = {
  [K in keyof T ]: () => T[K];
};
到
type PersonGetter<T> = {
  [K in keyof T as `get${Capitalize<K & string>}`]: () => T[K];
};
let personGetter!: PersonGetter<Person>;
let r3 = personGetter.getName();
let r2 = personGetter.getAge();


安全判断并大写首字母
type CapitalizeString<T> = T extends string ? Capitalize<T> : T;