• typescript(四) 类型保护


    类型保护指的是确认分支作用域中的类型。可以更具体的调用参数上的属性和方法。

    1. 基本类型保护

    function first(a: number|string|boolean):number {
      if(typeof a === 'number') {
        return a;
      } else if(typeof a === 'string') {
        return a.length;
      } else {
        return 0;
      }
    }

    2. 类保护-instanceof

    class Animal{
      name: string = '';
    }
    class Bird extends Animal {
      sing: string = 'song';
    }
    class Dog extends Animal {
      eat: string = 'bone';
    }
    function second(animal: Animal) {
      if (animal instanceof Bird) {
        return animal.name;
      } else if(animal instanceof Dog) {
        return animal.eat;
      } else {
        return animal.name;
      }
    }

    3. null保护

    开启了strictNullChecks, 则不能直接调用变量可能为null的变量上的方法和属性。

    1.  使用!

    function t(str: string|null) {
      return str!.length
    }

    2. 使用 ||

    function t1(str: string|null) {
      str = str || '';
      return str.length
    }

    3. 使用链判断运算符-?.

    ⚠️该运算符处于stage1阶段,现不能直接使用;需要安装插件

    let a = {b:0};
    let c = a?.b; 
    // 原理: 如果变量为null,或者该变量不存在某属性
    if (!a) {
      return undefined
    } else {
      return a.b
    }

    4. 联合类型保护

    1. 可以通过同名属性的不同值进行区分

    interface WarningButton {
      text: 'warning',
      color: 'yellow'
    }
    interface DangerButton {
      text: 'danger',
      do: 'be careful'
    }
    type Button = WarningButton | DangerButton;
    function chooseBtn(button: Button) {
      if(button.text === 'warning') {
        return button.color;
      } else if(button.text === 'danger') {
        return button.do;
      }
    }

    2. 可以通过各自的特有属性进行区分-in

    interface WarningBtn {
      text: string,
      color: string
    }
    interface DangerBtn {
      text: string,
      do: string
    }
    type Btn = WarningBtn | DangerBtn;
    function ChooseBtn(btn: Btn) {
      if ('color' in btn) {
        return btn.color;
      } else if('do' in btn) {
        return btn.do;
      }
    }

    3. 自定义实现类型保护-is

    当方法1,2都不能满足条件的时候

     interface Bird {
       legs: number
     }
     interface Dog {
       legs: number
     }
     type Animals = Bird | Dog;
     function isBird(x: Animals):x is Bird {
       return x.legs === 2;
     } 
     function diffAni(x: Animals) {
       if(isBird(x)) {
         // to be Bird
       } else {
         // to be  Dog
       }
     }
  • 相关阅读:
    《移动开发者周刊》第十一期
    2012安卓巴士开发者沙龙成都站大家抓紧报名
    23岁那年你正处在哪个状态?现在呢?
    《老罗Android开发视频教程》老罗来交国庆的答卷了
    程序员,你的一千万在哪里?
    《老罗Android开发视频教程》更新
    2012全球开发者大会项目投资一对一相亲会
    windows远程桌面
    [LeetCode] NQueens
    [LeetCode] Pascal's Triangle II
  • 原文地址:https://www.cnblogs.com/lyraLee/p/12396524.html
Copyright © 2020-2023  润新知