最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Typescrit从入门到放弃系列(九)-类型保护

    正文概述 掘金(golderBrother)   2021-01-24   507

    通过判断识别所执行的代码块,自动识别变量属性和方法

    一.typeof类型保护

    function double(val: number | string) {
        if (typeof val === 'number') {
            val
        } else {
            val
        }
    }
    

    二.instanceof类型保护

    class Cat { }
    class Dog { }
    
    const getInstance = (clazz: { new(): Cat | Dog }) => {
        return new clazz();
    }
    let r = getInstance(Cat);
    if(r instanceof Cat){
        r
    }else{
        r
    }
    

    三.in类型保护

    interface Fish {
        swiming: string,
    }
    interface Bird {
        fly: string,
        leg: number
    }
    function getType(animal: Fish | Bird) {
        if ('swiming' in animal) {
            animal // Fish
        } else {
            animal // Bird
        }
    }
    

    四.可辨识联合类型

    interface WarningButton {
        class: 'warning'
    }
    interface DangerButton {
        class: 'danger'
    }
    function createButton(button: WarningButton | DangerButton) {
        if (button.class == 'warning') {
            button // WarningButton
        } else {
            button // DangerButton
        }
    }
    

    五.null保护

    const addPrefix = (num?: number) => {
      num = num || 1.1;
      function prefix(fix: string) {
          return fix + num?.toFixed()
      }
      return prefix('james');
    }
    console.log(addPrefix()); // james1
    

    六.自定义类型保护

    interface Fish {
      swimming: string,
    }
    interface Bird {
      fly: string,
      leg: number
    }
    function isFish(animal: Fish | Bird):animal is Bird {
      return 'swimming' in animal
    }
    function getAnimal (animal:Fish | Bird){
      console.log(isFish(animal)); // false
      if(isFish(animal)){
          animal
      }else{
          animal
      }
    }
    console.log(getAnimal({fly: "fly", leg: 2}));
    

    七.完整性保护

    interface ICircle {
        kind: 'circle',
        r: number
    }
    interface IRant {
        kind: 'rant',
        width: number,
        height: number
    }
    interface ISquare {
        kind: 'square',
        width: number
    }
    type Area = ICircle | IRant | ISquare
    const isAssertion = (obj: never) => { }
    const getArea = (obj: Area) => {
        switch (obj.kind) {
            case 'circle':
                return 3.14 * obj.r ** 2
            default:
                return isAssertion(obj); // 必须实现所有逻辑
                // Argument of type 'IRant | ISquare' is not assignable to parameter of type 'never'.
                // Type 'IRant' is not assignable to type 'never'.ts(2345)
        }
    }
    

    起源地下载网 » Typescrit从入门到放弃系列(九)-类型保护

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元