
用扩展运算符即可。
type Unshift<T extends any[], U> = [U,...T]

使用infer 推导即可。
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer U) => any?U:never;

就是extends 一个函数模板,然后使用infer U即可。
type MyReturnType<T extends (...args :any[]) => any > = T extends (...args :any[]) => infer U?U:never;

type MyOmit<T, K> = {
[P in keyof T as P extends K ? never : P]: T[P]
}
// or
type MyOmit<T, K> = Pick<T, Exclude<keyof T, K>>

type MyReadonly2<T, K extends keyof T = keyof T> = {
readonly [P in keyof T] : T[P]
} & {
[P in keyof T as Exclude<P, K>]: T[P]
}
// = 为泛型参数设置默认值
// 1. K extends keyof T 不成立时,赋值默认值 keyof T 给第二泛型参数
// 2. 先计算出一个只存在 readonly 字段的对象
// 3. 再通过内置工具类型 Omit,计算出不包含 K 的对象
// 4. 再使用 & 计算出两个类型的交叉类型()
type MyReadonly2<T, K extends keyof T = keyof T> = {
+readonly [P in K]: T[P]
} & Omit<T, K>

使用递归即可。判当前是对象还是某一个属性。
type DeepReadonly<T> = {
readonly [P in keyof T]: keyof T[P] extends never ? T[P] : DeepReadonly<T[P]>
}