Typescript 内置工具类型

  1.  Partial<T> 将类型T的属性都变为可选属性,并构造一个新类型

    1 interface Inter {
    2     name: string
    3     age:number
    4 }
    5 
    6 type T = Partial<Inter> // { name?: string; age?: number; }

     

  2.  Required<T>  将类型T的属性都变为必选属性,并构造一个新类型  和 Partial正好相反

    interface Inter { 
        name?: string
        age?:number
    }
    
    type T = Required<Inter> // { name: string; age: number; }

     

  3. Readonly<T> 构造一个新类型,并将实际类型参数T中的所有属性变为只读属性
    interface A {
        x: number
        y: number
    }
    type T = Readonly<A>; // // { readonly x: number; readonly y: number; }
    const a: T = { x: 0, y: 0 };
    // a.x = 1;   // 编译错误!不允许修改
    // a.y = 1;   // 编译错误!不允许修改

     

  4. Record<K,T>  构建一个属性名类型为K的联合类型,值为T类型的对象类型
    type K = 'x' | 'y';
    type T = number;
    type R = Record<K, T>; // { x: number; y: number; }
    const a: R = { x: 0, y: 0 };  //  x' y 不能缺失任何一个
    interface EmployeeType {
        id: number
        fullname: string
        role: string
    }
    
    let employees: Record<number, EmployeeType> = {
        0: { id: 1, fullname: "John Doe", role: "Designer" },
        1: { id: 2, fullname: "Ibrahima Fall", role: "Developer" },
        2: { id: 3, fullname: "Sara Duckson", role: "Developer" },
    }


    Record 实现源码:

    /**
     * Construct a type with a set of properties K of type T
     */
    type Record<K extends keyof any, T> = {
        [P in K]: T;
    };

    K中的所有属性值都转换为T类型,并将返回的新类型返回给proxyKType,K可以是联合类型、对象、枚举…

    追加属性:

    type K = 'name' | 'age' | 'sex'
    type T = string
    type Ks = K | 'height' // 追加属性
    type R = Record<Ks, T>
    
    const LILI: R  = {
        name: 'LILI', 
        sex: 'man',
        age: '12', 
        height:'178'
    }

     

  5. Pick<T,K>  从已有类型T中选组指定类型 K 中的属性及其类型后构建出一个新德对象类型
    interface A { 
        x: number
        y: string
    }
    type T = Pick<A,'x'> // { x: number; }
    interface SuperbUser {
      userId: number;
      macAddress: string;
      username: string;
      email: string;
      password: string;
      firstName: string;
      lastName: string;
      roles: ('Admin' | 'Editor' | 'Author')[]
    };
    
    type GuestUser = 'userId' | 'macAddress' | 'username'
    type T = Pick<SuperbUser , GuestUser> // { userId: number; macAddress: string; username: string; }

      const USER: T = {
        userId: 1001,
        macAddress: '58962535',
        username:'XIANA'
      }

      // console.log(USER.roles) // 错误 Property 'roles' does not exist on type 'Pick<SuperbUser, GuestUser>'.

     

     

  6.  Omit<T,K> 与 Pick相反 剔除类型T中存在的K类型后构建出一个新类型     该属性 在 TS 3.5.1 中添加,旧版本的 TS不支持  使用“skipLibCheck”:true作为tsconfig.json文件中的编译器选项
    interface A { 
        x: number
        y: string
    }
    type T = Omit<A,'x'> // { y: number; }

     

 

posted @ 2023-06-28 16:14  小小黑加白  阅读(43)  评论(0编辑  收藏  举报