xiaoYuanDun
xiaoYuanDun
本质上要自己实现 Partial, Required, Pick, Exclude, Omit 等简单工具类型, 然后组合出复杂类型 ```ts type Partial_ = { [k in K]?: T[k] } type Required_ = { [k in K]-?: T[k] } type Pick_ =...
用模板字符串进行递归就行了 ```ts type RepeatString< T extends string, C extends number, S extends any[] = [], // 用于判断是否递归完毕 U extends string = '' // 用于累加记录已遍历过的字符串 > = S['length'] extends C ?...
个人觉得这道题主要是要发现, config 可以进行链式调用, 这样可以很容易的联想到 js 中的 `return this` 这种思路, 那么这里 `option` 的返回值就应该是一个新的 `Chainable`, 把添加了新属性的类型当做下一个 `Chainable` 的 `T` 即可 关于如何动态命名 key, 可以看一下官方介绍 ```ts // 给基础类型 T 增加 { K, V }...
和 29 题一样 ```ts type Split< S extends string, Delimiter extends string, R extends any[] = [] // 记录遍历记录 > = S extends `${infer R1}${Delimiter}${infer R2}` ? Split // 记录R1,...
没啥难的,就是通过数值,构建对应长度的数组的常规操作 ```ts // 构建数组 type GenArr = S['length'] extends T ? S : GenArr type Add = [...GenArr, ...GenArr]['length'] type A0 = Add; // 10 type A1 = Add //...
> ```ts > type IsUnion = T extends U ? ([U] extends [T] ? false : true) : never; > > type I0 = IsUnion; // true > type I1...
首先利用 TS 模板字符串把默认数组 S 的长度转为字符串,之后那这个字符串和 T 比较,若相等,表示当前 S 的长度和传入的字符串所对应的数值相等 (如,"15" --> 15),否则增加 S 的长度,进行下一次 ToNumber 判断 不过这种方式可能会出现一个警告:`Type instantiation is excessively deep and possibly infinite. ts(2589)`,因为字符串过大时,可能会导致递归次数变多,个人认为可以忽略此错误 基本上,这种和数组有关系的类型,都需要构建一个辅助数组来进行判断 ```ts type ToNumber =...
一个新的思路,感觉有点复杂了,不过比之前的最大限制提升了一些 ```ts // 10进制数,递归数不超过10,解决了递归次数过多的报错问题 type GetNumber = `${L}` extends T ? L : GetNumber // 字符串转反向数组, 方便从后向前构建目标数组, 如: '1234' -> ['4', '3', '2', '1'] type StrToReverseArr = T extends `${infer...
和 32 题思路一样 ```ts type Repeat< T, C extends number, S extends any[] = [], // 递归判断条件 U extends any[] = [] // 累加记录 > = S['length'] extends C ?...
感觉我这个方法有点僵硬, 完全就是字符串的替换, 把 `'['` 替换为 `'.'`, `]` 替换为 `''`, 然后检查 `'.'` 前后的子字符串, 存入结果数组 ```ts type ToPath = T extends `${infer R1}[${infer R2}` ? ToPath : T extends `${infer R3}]${infer R4}`...