• TS学习随笔(二)->类型推论,联合类型


    这篇内容指南:

              -----类型推论

         -----联合类型

    类型推论

    第一篇中我们看了TS的基本使用和基本数据类型的使用,知道了变量在使用的时候都得加一个类型,那我们可不可以不加呢,这个嘛,可以也不可以,为啥这木说呢,各位看官我们上眼瞧一下.

    首先我们要来先了解一个概念,类型推论:如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型

    例子一:

    let myFavoriteNumber = 'seven';
    myFavoriteNumber = 7;
    
    // index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

    看吧,没指定类型报错了吧。因为这样赋值等同于

       let myFavoriteNumber: string = 'seven';

    但是我为啥说的是可以也不可以呢,来,我们继续瞧一瞧

    例子二:

    let myFavoriteNumber;
    myFavoriteNumber = 'seven';
    myFavoriteNumber = 7;

    哎,这样咋没报错,其实在定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查

    这就是JS的类型推论,是不是美滋滋,这样妈妈就再也不担心我参数类型传的有问题了

    联合类型

      我们想想会不会有这个情景,一个变量我们既允许他是string又可以是number,那我们怎么办呢,用any吗?显然是不行的,用any那不是什么类型都能传进去了,那我们怎么做呢,这里就又要亮出一个概念了

       这就是我们要说的联合类型,这个概念一看就知道是把几个类型联合起来,那怎么实现啵,跟概念一样简洁明了

    let Adam:string | number
    Adam =  'seven';
    Adam = 7
    
    let Sh:string | number
    Sh = true
    // index.ts(2,1): error TS2322: Type 'boolean' is not assignable to type 'string | number'.
    //   Type 'boolean' is not assignable to type 'number'.

    联合类型使用 | 分隔每个类型。

    注意:当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法

    function getLength(something: string | number): number {
        return something.length;
    }
    
    // index.ts(2,22): error TS2339: Property 'length' does not exist on type 'string | number'.
    //   Property 'length' does not exist on type 'number'.

    上述例子会报错,是因为length并不是string和number的公共方法

    访问 string 和 number 的共有属性是没问题的:

    function getString(something: string | number): string {
        return something.toString();
    }

    联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型:

    let myFavoriteNumber: string | number;
    myFavoriteNumber = 'seven';
    console.log(myFavoriteNumber.length); // 5
    myFavoriteNumber = 7;
    console.log(myFavoriteNumber.length); // 编译时报错
    
    // index.ts(5,30): error TS2339: Property 'length' does not exist on type 'number'.

    上例中,第二行的 myFavoriteNumber 被推断成了 string,访问它的 length 属性不会报错。

    而第四行的 myFavoriteNumber 被推断成了 number,访问它的 length 属性时就报错了。

    原文参考自:https://github.com/xcatliu/typescript-tutorial/blob/master/basics/union-types.md

  • 相关阅读:
    POJ 2411 Mondriaan's Dream( 轮廓线dp )
    BZOJ 4177: Mike的农场( 最小割 )
    BZOJ 2186: [Sdoi2008]沙拉公主的困惑( 数论 )
    2015.8.27
    BZOJ 1084: [SCOI2005]最大子矩阵( dp )
    BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )
    BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )
    BZOJ 1025: [SCOI2009]游戏( 背包dp )
    BZOJ 2795: [Poi2012]A Horrible Poem( hash )
    HDU 5636 Shortest Path 分治+搜索剪枝
  • 原文地址:https://www.cnblogs.com/suihang/p/10609865.html
Copyright © 2020-2023  润新知