• ts笔记-辨析联合类型


    如果一个类型是多个类型的联合类型,且多个类型含有一个公共属性,那么就可以利用这个公共属性,来创建不同的类型保护区块。这个公共属性称为辨识属性,这种类型称为辨析联合类型。

    // 示例
    interface Square {
      kind: 'square';
      size: number;
    }
    
    interface Rectangle {
      kind: 'rectangle';
       number;
      height: number;
    }
    
    type Shape = Square | Rectangle;
    

    求面积

    function area(s: Shape) {
      switch (s.kind) {
        case 'square':
          return s.size * s.size;
        case 'rectangle':
          return s.width * s.height;
      }
    }
    

    area用于求面积,但是如果联合类型添加了其他类型,area函数没有定义成处理这种类型的方法,就会导致bug参数。

    interface Square {
      kind: 'square';
      size: number;
    }
    
    interface Rectangle {
      kind: 'rectangle';
       number;  
      height: number;
    }
    
    interface Circle {
      kind: 'circle';
      radius: number;
    }
    
    
    type Shape = Square | Rectangle | Circle;
    
    function area(s: Shape) {
      switch (s.kind) {
        case 'square':
          return s.size * s.size;
        case 'rectangle':
          return s.width * s.height;
      }
    }
    
    // 编译通过,有隐藏的bug
    area({
      kind: 'circle',
      radius: 1
    })
    

    为了避免这种潜在bug的出现,我们可以定义一个default情况

    // 当Shape增加了新类型,但是area函数没有处理这种类型,编译直接报错
    // 比如新增了Circle类型,不能将类型“Circle”分配给类型“never”
    function area(s: Shape) {
      switch (s.kind) {
        case 'square':
          return s.size * s.size;
        case 'rectangle':
          return s.width * s.height;
        default:
          const invalidKind: never = s
          throw new Error(`Unknown ${invalidKind}`)
      }
    }
    
    常用网站: SegmentFault | GitHub | 掘金社区
  • 相关阅读:
    4. Validator校验器的五大核心组件,一个都不能少
    如何快速提高数据库查询效率
    linux系统简介
    echo命令
    Linux-->基本查找及vim使用
    jmeter.5.4.1
    Shell文本处理三剑客:grep、sed、awk
    Linux 下的dd命令使用详解
    Linux添加硬盘和挂载两个命令fdisk和mount的使用
    Linux系统常用命令速查手册
  • 原文地址:https://www.cnblogs.com/yesyes/p/15502939.html
Copyright © 2020-2023  润新知