ts的高级类型

126 阅读1分钟

先熟悉一下基础内容 断言和泛型

类型断言

尖括号语法 <类型>变量名
    let value:any = "this is a string";
    let length:number = (<string>value).length;
as语法 变量名 as 类型
   let value:any = "this is a string";
   let length:number = (value as string).length;  
非空断言

明确某个值不可能为undefinednull时,可以在变量后面加个!

    function(value:string|undefined|null){
        const str:string = value; // error value有可能为undefined和null
        const str:string = value!; // ok
        const length: number = value.length; // error value 可能为 undefined 和 null 
        const length: number = value!.length; //ok
    }
确定赋值断言

在实例属性和变量属性声明后面放置一个!号,表示该属性会被明确的赋值

    let name!:string

泛型

    // 传入的类型和返回的类型相同
    function identity<T>(arg:T):T{
        return arg
    }
    
    // 使用
    identity<string>('hello')

程序类型工具

注意:这些程序类型仅限制于type类型声明中使用

Record

以typeof格式快速创建一个类型,此类型包含一组指定的属性且都是必填。

    type Coord = Record<x|y,number>
    type ImageList = Record<string,{default:string}>
    
    // 等同于
    type coord = {
        x:number;
        y:number
    }
    
    type ImageList = {
        [key:string]:{default:string};
    }

Partial

将类型定义的所有属性变为可选

    type Coord = Partail<Record<x|y,number>>
    
    //等同于
     type coord = {
        x?:number;
        y?:number
    }

Pick

从类型定义的属性中选取指定的一组属性,返回新的类型定义

 type Coord = Record<x|y,number>
 type CoordX = Pick<Coord,x>
 
 // 等同于
 type Coordx = {
     x:number;
 }
    

Require

将类型定义的所有属性变为必填,与Parital相反

type Coord = Require<{x:number,y?:number}>

 // 等同于
 type Coordx = {
     x:number;
     y:number;
 }
    

Omit

排除指定的属性,与Pick相反

    interface Coord {
        a:number;
        b:string;
        c:boolean;
    }
    
    type AC = Omit<Coord,b>   // {a:number;b:string} 
    type C = Omit<Coord,a|b>  // {c:boolean}

剩余的高级类型看这里