TS初体验——断言

TS断言

类型断言好比其他语言里的类型转换,但是不进行特殊的数据检查和解构,它没有运行时的影响,只是在编译阶段起作用。

类型断言有两种形式:

  • 尖括号语法

  • let someValue:any = "this is a string";
    let strLength:number = (<string>someValue).length
    
  • as 语法

  • let someValue:any = "this is a string";
    let strLength:number = (someValue as string).length
    
类型守卫

类型保护是可执行运行时检查的一种表达式,用于确保改类型在一定范围内。也就是类型保护可以保证一个字符串是一个字符串,尽管它的值也可以是一个数值。类型保护与特性检测并不是完全不同,其主要思想是尝试检测属性、方法或原型,以确定如何处理值。目前主要有四种的方式来实现类型保护:

  • in关键字

  • interface Admin {
      name: string;
      privileges: string[];
    }
    
    interface Employee {
      name: string;
      startDate: Date;
    }
    
    type UnknownEmployee = Employee | Admin;
    
    function printEmployeeInformation(emp: UnknownEmployee) {
      console.log("Name: " + emp.name);
      if ("privileges" in emp) {
        console.log("Privileges: " + emp.privileges);
      }
      if ("startDate" in emp) {
        console.log("Start Date: " + emp.startDate);
      }
    }
    
  • typeof关键字

  • function padLeft(value: string, padding: string | number) {
      if (typeof padding === "number") {
          return Array(padding + 1).join(" ") + value;
      }
      if (typeof padding === "string") {
          return padding + value;
      }
      throw new Error(`Expected string or number, got '${padding}'.`);
    }
    
    • typeof类型保护只支持两种形式:typeof v === ‘typename’ 和typeof v ! ==typename,'typename’必须是number,string,boolean或symbol。但是TS并不会阻止你与其他字符串比较,语言不会把那些表达式识别为类型保护。
  • instanceof关键字

    • interface Padder {
        getPaddingString(): string;
      }
      
      class SpaceRepeatingPadder implements Padder {
        constructor(private numSpaces: number) {}
        getPaddingString() {
          return Array(this.numSpaces + 1).join(" ");
        }
      }
      
      class StringPadder implements Padder {
        constructor(private value: string) {}
        getPaddingString() {
          return this.value;
        }
      }
      
      let padder: Padder = new SpaceRepeatingPadder(6);
      
      if (padder instanceof SpaceRepeatingPadder) {
        // padder的类型收窄为 'SpaceRepeatingPadder'
      }
      
  • 自定义类型保护的类型谓词

    • function isNumber(x: any): x is number {
        return typeof x === "number";
      }
      
      function isString(x: any): x is string {
        return typeof x === "string";
      }
      
联合类型和类型别名
  • 联合类型

    联合类型通常与null和undefined一起使用:

    const sayHello = (name:string | undefined)=>{
    	...todo
    }
    此处name的类型是string|undefined,意味着可以将stringundefined的值串给sayHello函数。
    
    sayHello('mery');
    sayHello(undefined);
    

    类型A和类型B联合后的类型是同时接受A和B值的类型。

  • 可辨识联合

    • TS可辨识联合来行,也成为代数数据类型或标签联合类型。它包含3个要点:可辨识、联合类型和类型守卫。

    • 这种类型的本质是结合类型和字面量类型的而一种类型保护方法,若一个类型是多个类型的联合类型,且多个;欸行含有一个公共属性,那么就可以利用这个公共属性,来创建不同的类型保护去块。

    • 可辨识

      可辨识要求联合类型中的每个元素都含有一个单例类型属性,如:

      enum CarTransmission {
        Automatic = 200,
        Manual = 300
      }
      
      interface Motorcycle {
        type: "motorcycle"; // discriminant
        make: number; // year
      }
      
      interface Car {
        type: "car"; // discriminant
        transmission: CarTransmission
      }
      
      interface Truck {
        type: "truck"; // discriminant
        capacity: number; // in tons
      }
      

      上述代码的三个接口中都包含一个type属性,该属性被称为可辨识的属性,而其他的属性只跟特性的接口有关。

    • 联合类型

      基于之前的三个接口,我们可以创建一个联合类型:

      type veh = Motorcycle | Car |Truck
      

      然后我们可以开始使用veh联合类型,对于veh类型的变量,它可以表示不同类型的车辆。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值