题单
解答
4・实现 Pick
type MyPick<T, K extends keyof T> = {
[Key in K]: T[Key]
}
通过 keyof 取出 T 类型的所有键,如果只是 MyPick<T, K>的话,会报错如下
Type 'K' is not assignable to type 'string | number | symbol'.
Type 'key' cannot be used to index type 'T'.
7・实现 Readonly
type MyReadonly<T> = {
readonly [Key in keyof T]: T[Key]
}
https://tsch.js.org/11/play/zh-CN
11・元组转换为对象
type TupleToObject<T extends readonly any[]> = {
[Key in T[number]]: Key
}
14・第一个元素
type First<T extends any[]> = T extends [infer F, ...any[]] ? F : never
符合小册中模式匹配做提取套路,通过 extends 对类型参数做匹配,结果保存到通过 infer 声明的局部类型变量里,若匹配就能从该局部变量里拿到提取出的类型。
18・获取元组长度
type Length<T extends readonly unknown[]> = T['length']
会抛出 Error 说明得限制传入的类型
43・Exclude
type MyExclude<T, U> = T extends U ? never : T
这题可能看的人一头雾水,但是可以看看这里:Distributive Conditional Types
type ToArray<Type> = Type extends any ? Type[] : never
// 如果我们将联合类型插入 ToArray,则条件类型将应用于该联合的每个成员。
type StrArrOrNumArr = ToArray<string | number>
// ^type StrArrOrNumArr = string[] | number[]
也就是分别判断 T 中的每个联合类型,是否 extends U
189・Awaited
type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer V>
? V extends PromiseLike<any>
? MyAwaited<V>
: V
: never
这里用到了 PromiseLike 这个类型
268・If
type If<C extends boolean, T, F> = C extends true ? T : F
这题也比较基础,考的就是 extends
533・Concat
在类型系统里实现 JavaScript 内置的 Array.concat
方法,这个类型接受两个参数,返回的新数组类型应该按照输入参数从左到右的顺序合并为一个新的数组。
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
898・Includes
在类型系统里实现 JavaScript 的 Array.includes
方法,这个类型接受两个参数(左边参数是否 include 右边参数),返回的类型要么是 true
要么是 false
。
type IsEqual<A, B> = (A extends B ? true : false) & (B extends A ? true : false)
type Includes<T extends readonly any[], U> = T extends [infer F, ...infer Rest]
? IsEqual<F, U> extends true
? true
: Includes<Rest, U>
: false
运用了小册中的套路三:递归复用做循环,
3057・Push
type Push<T, U> = T extends [...infer Rest] ? [...Rest, U] : never
3060・Unshift
type Unshift<T, U> = T extends [...infer Rest] ? [U, ...Rest] : never
3312・Parameters
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer A) => any ? A : never