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;