记事本做网站怎么调整图片间距,杭州房价,陕西省建设厅申报网站,网站免费推广网站历史小剧场 这个世界上#xff0c;有两种人最痛苦#xff0c;第一种是身居高位者#xff0c;第二种是身居底层者#xff0c;第一种人很少#xff0c;第二种人很多。第一种人叫崇祯#xff0c;第二种人叫百姓。 而最幸福的#xff0c;就是中间那拨人#xff0c;主要工作…历史小剧场 这个世界上有两种人最痛苦第一种是身居高位者第二种是身居底层者第一种人很少第二种人很多。第一种人叫崇祯第二种人叫百姓。 而最幸福的就是中间那拨人主要工作叫做欺上瞒下具体特点是除了好事什么都办除了脸什么都要。—《明朝那些事儿》 字符串模板与extends/infer
extends: 有两个作用1、接口继承2、类型判断这篇文章主要是体现这个作用;infer: 推导泛型参数只在extends右边使用 案例 type str beyond;// 获开头
type getFirstT T extends ${infer First}${infer Rest}? First : never;
type FirstLetter getFirststr; // type FirstLetter b// 获取除开头的部分
type getRestT T extends ${infer First}${infer Rest} ? Rest : never;
type RestLetters getReststr; // type RestLetters eyond// 以y分隔
type SplitT T extends ${infer Front}y${infer Back} ? Back : never;
type Splitted Splitstr; // type Splitted ond判断开头
type startsWidthstr extends string, prefix extends string str extends ${prefix}${infer Rest} ? true : false;
type startsWidthKong startsWidthkong, ; // type startsWidthKong true
type StartsWithBe startsWidthstr, be; //type StartsWithBe true
type StartsWithC startsWidthstr, c; // type StartsWithC false转为首字母大写
type UppercaseFirstT extends string T extends ${infer First}${infer Rest} ? ${UppercaseFirst}${Rest} : never;
type UppercaseStr UppercaseFirststr; // type UppercaseStr Beyond文本替换-替换第一个
type ReplaceOnestr extends string, from extends string, to extends string str extends ${infer Front}${from}${infer Rest} ? ${Front}${to}${Rest} : str;
type ReplaceStr ReplaceOnestr, o, a; // type ReplaceStr beyand键值对转索引 a1 {a:1}
type ConvertStrToRecordstr extends string str extends ${infer key}${infer value} ? { [k in key]: value } : never;
type ConvertStrToRecordStr ConvertStrToRecorda1;
// type ConvertStrToIndexStr {// a: 1;
// }as 重映射-索引的重命名 索引转大写
interface IOut {aaa: 1,bbb: 2,fun: () void
}
type UpperKeysT extends Recordstring, any {[K in keyof T as (T[K] extends Function ? K : UppercaseK)]: T[K]
}
type res UpperKeysIOut;
// type res {
// AAA: 1;
// BBB: 2;
// fun: () void;
// }合并索引
interface IOut2 {ccc: 3,ddd: 4
}
type CombineIndexA extends Recordstring, any, B extends Recordstring, any {[K in keyof A | keyof B] : K extends keyof A ? A[K] : K extends keyof B ? B[K] : never
}
type combine CombineIndexIOut, IOut2;
// type combine {
// aaa: 1;
// bbb: 2;
// fun: () void;
// ccc: 3;
// ddd: 4;
// }巧用递归 文本替换-替换所有
type ReplaceAllStr extends string, From extends string, To extends string Str extends ${infer Front}${From}${infer Rest} ? ${Front}${To}${ReplaceAllRest, From, To} : Str;
type ReplaceAllStr ReplaceAll12333333456, 3, A; // type ReplaceAllStr 12AAAAAA456字符串反转
type ReverseStr extends string, Res extends string Str extends ${infer First}${infer Rest} ? ReverseRest, ${First}${Res} : Res;
type ReverseStr Reversehello; // type ReverseStr olleh综合 字符串解析-初级
例如我们要将 a1b2c3 转为 {a:1, b:2, c:3} 那么我们要有按这三步走
分割取 键值对 处理处理单个的 键值对 转换为 索引类型把 转换后的 索引类型 合并
type ParseStr extends string, Res extends Recordstring, any {} Str extends ${infer One}${infer Rest} ?ParseRest, CombineIndexRes, ConvertStrToRecordOne :CombineIndexRes, ConvertStrToRecordStrtype parseToRecord Parsea1b2c3; // type parseToRecord {a: 1, b: 2, c: 3}字符串解析-升级
如果只有键没有值则返回 {key: true};合并重复索引。例如 a1a2 转为 {a: [‘1’, ‘2’]};合并的值不能重复。例如 a1a2a2 转为 {a: [‘1’, ‘2’]};
type ConvertStrToRecordUpStr extends string Str extends ${infer Key}${infer Value} ? { [K in Key] : Value } : Str extends ${infer Key} ? { [K in Key]: true } : {};
type ConvertStrToRecordUpStr ConvertStrToRecordUpa;
// type ConvertStrToRecordUpStr {
// a: true;
// }// 合并重复索引
type CheckDuplicateA extends Recordstring, any, B extends Recordstring, any keyof B extends keyof A ? AddRA, B : CombineIndexA, B;
type AddRA extends Recordstring, any, B extends Recordstring, any {[K in keyof A] : K extends keyof B ?CheckInclueA[K], B[K] extends true ? A[K] : // 重复索引合并值值不能重复A[K] extends any[] ? [...A[K], B[K]] : [A[K], B[K]] : A[K]
}type CheckInclueA extends any[], B extends string A extends [infer First, ...infer Rest] ? First extends B ? true : CheckInclueRest, B : false;
type checkIncludeDemo CheckInclue[a, b, c], a; // type checkIncludeDemo truetype ParseUpStr extends string, Res extends Recordstring, any {} Str extends ${infer One}${infer Rest} ?ParseUpRest, CheckDuplicateRes, ConvertStrToRecordUpOne :CheckDuplicateRes, ConvertStrToRecordUpStrtype parseToRecordUp ParseUpa1ba2a3cd4ee10a3;
// type parseToRecordUp {
// b: true;
// c: true;
// a: [1, 2, 3];
// e: [true, 10];
// d: 4;
// }