高级TS类型,Partial ReadOnly Pick omit 实现

40 阅读1分钟

1 Ts 类型,用于描述变量属性 泛型,用于复用类型

partial 可选

// type PartialRes = Partial<{name: 'dong', age: 18}>;

// 1. 为何直接使用<T>
//[] 是索引类型吗//
type MyPartial<T> = {
    [p in keyof T]?: T[p]
} 

// Pick
// 要确保传入的K也完全属于T内部元素,


type MyPick<T,K extends keyof T> =  {
    [p in  K] : T[p]
}

// Omit
type MyOmit<T,K extends keyof T> = {
    [p in Exclude<keyof T,K>]: T[p]
}
// 不理解的是Exclude<keyof T,K> 返回到底是什么
type MyOmit2<T,K extends keyof T> = MyPick<T,Exclude<keyof T,K>>

// readonly
type MyReadOnly<T> = {
  readonly  [p in keyof T]?: T[p]
} 
4. `keyof` 和 `in` 的协作

`keyof` 提供键的联合类型,`in` 遍历这些键生成新类型。

interface User {
  id: number;
  name: string;
}

// 将 User 的所有属性变为可选
type PartialUser = { [P in keyof User]?: User[P] };
// 等价于:{ id?: number; name?: string }