好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

typescript笔记-高级类型

一、交叉类型(&): 将多个类型合拼在一起

  1   //   示例1 
  2  type I0 = {TOP:"TOP"}; //  使用type声明的字面量类型 
  3   interface I1 {
   4       name:string
   5      sleep:()=> void 
  6   }
   7   interface I2 {
   8       name:string
   9      working:()=> void 
 10   }
  11  
 12  type I3 = I1&I2& I0
  13  let O1:I3 = {  //  合拼的所有成员类型不能少也不能多 
 14      name:"121" ,
  15       sleep(){},
  16       working(){},
  17      TOP:"TOP" ,
  18   }
  19  
 20   //   示例2  
 21   function  Extend<T,U>(first:T,second:U):T& U{
  22     let res = <T&U>{} ; //  正确 
 23        //   let res:T&U;//正确 
 24       //  let res = {} as T&U; //正确 
 25      //    let res = {};// 没指定类型。报错 
 26       for  (let key  in   first) {
  27          (<any>res)[key] = first[key]; //  需要使用断言,否则报类型错误 
 28       }
  29       for  (let key  in   second) {
  30           if   (Object.prototype.hasOwnProperty.call(res, key)) {
  31              (<any>res)[key] =  second[key]
  32           }
  33       }
  34       return   res
  35   }
  36  let oj1 = {a:1 }
  37  let oj2 = {a:2,b:1 }
  38  let ro = Extend(oj1,oj2)

 

二、联合类型( | ): 指定多个类型,多选一

  1   interface I1 {
   2       name:string
   3      sleep:()=> void 
  4   }
   5  type I4 = I1|I2|'LEFT'|'TOP'|'RIGHT'|'BUTTOM'
  6  
  7  let O2:I4 = "BUTTOM" ; //   这里选了字面量类型 BUTTOM 
  8  let O3:I4 = {  //   这里选了I1 类型 
  9      name:"ds" ,
  10       sleep(){}
  11  }

 

三、类型别名 type 

1. 只是给类型起一个名字,不会创建类型

2. 类型别名与接口区别,鼠标悬浮在类型上会显示字面量类型,而接口只会显示Interface

3. 类型别名不能别 extends和implements 

 1  type T1=string   //  原始类型 
 2  
 3  type2 T2 = {  //   对象类型 
 4      name:string,
  5     age:number      
  6   }
  7  
 8  type  T3 = "success" ||"fail" ; //   字面量类型 

 

四、 获取值的类型 / 类型保护  typeof

  1   //   示例1:获取数据类型 
  2  let O4 = {name:"lily",age:12 }
   3  type I4 =  typeof   O4
   4  
  5   class O5 {
   6      uid:number| null = null 
  7       constructor(){}
   8       getName(){}
   9       getAge(){}
  10      
 11   }
  12  let obj =  new   O5()
  13  type I6 =  typeof   obj
  14  
 15   //   示例2:做类型保护判断 
 16   function  fn1(data:string| number){
  17       if ( typeof  data==="string" ){
  18           //   dosomething 
 19      } else   if ( typeof  data==="number" ){
  20           //   dosomething 
 21       }
  22  }

 

五、 限制类型的属性选项 keyof

  1   //  示例1 
  2  type I1 = {
   3       id:number
   4       name:string
   5       age:number
   6   }
   7  type I2 =  keyof I1; //   获取到I1的类型属性key(是一个联合类型):id|name|age 
  8  
  9  
 10   //  示例2: 
 11   //   原来写法 
 12   function   getValue(obj:any,key:string){
  13       return   obj[key]
  14   }
  15  getValue({name:"limk"},"id"); //  如果获取的值不存在,不会有任何提示 
 16  
 17   //  限制类型写法 
 18   function  getVlaueH<T> (obj:T,key:keyof T){
  19       return   obj[key]
  20   }
  21  getVlaueH({name:"mike"},"name"); //   如果第二参数的key 不存在第一个参数的对象中就会报类型错 

 

六、映射类型:keyof+in

 简单实现利用keyof+in 将可选类型变成必要类型

  1  type person =  {
   2       name:string,
   3      age? :number,
   4       id:number
   5   }
   6  type Readolys<T>= {
   7       [k  in  keyof T]-? :T[k]
   8   }
   9  let pser:Readolys<person> =  {
  10      name:"mike" ,
  11      age:1 ,
  12      id:1
 13  }

 

七:条件类型:条件类型指由表达式所决定的类型

 1   //   示例,常见写法 
 2  T  extends U?T:U ; //   如果T 类型 属于 U类型,则返回T 类型,否侧返回U类型 
 3  
 4   示例:
  5  let dataType = "TOP"|"LEFT"|"BUTTOM"|"RIGHT"
 6  type Ttype<T,U> = T extends U? true : false 
 7  type res1 = Ttype<"TOP",dataType>; //   true 
 8  type res2 = Ttype<"fail",dataType>; //   false 

 

八、 类型断言与保护

(1.)  当你确定 知道某个值的类型,ts 可能在类型中检测不到,你就可以使用断言确定该值的类型

(2.) 官网说有两种写,一个是 as ,一个是尖括号<类型>值, 在typescript 中的tsx 只支持as 断言写法,还有一个 is 

 (8.1) as

 //  这里获取元素,ts会检测有可能不存在,你可以指定是它一定存在指定类型 
let div = document.getElementById("div") as HTMLDivElement; //  HTMLDivElement;  

   (8.2)  <类型>值:这里尖括号<> 不要和泛型搞乱了,泛型是在变量前<>; 断言是对值 重新声明类型,<>在值的前面

 1   let str = "this is string" ;
  2  let len = (<string>str).length

 (8.3)is :自定义类型保护, 一般在函数参数中用,用来判断某个属性属性某个类型

  1      //  示例1 
  2   function   isString(s:unknown):s is string{
   3       return   typeof  s ==="string"
  4   }
   5   //  示例2 
  6   type Fish =  {
   7       swim:()=> void 
  8   }
   9  type Bird =  {
  10      fly:()=> void 
 11   }
  12   function  isFish<T>(pet: Fish |  Bird): pet is Fish {
  13       return  (<Fish>pet).swim !==  undefined;
  14  }

 

九、通过索引访问类型的自类型

 1  let I1 =  {
  2      id:1 ,
  3      name:"name1" ,
  4       childs:[
  5          {id:2,name:"name2" ,childs:[]}
  6       ]
  7   }
  8  type I2 =  typeof    I1 
  9  let O8:I2['childs'] = [{id:1,name:"like",childs:[]}]

 

查看更多关于typescript笔记-高级类型的详细内容...

  阅读:47次