TypeScript-----数据类型

613 阅读5分钟

###原始数据类型

ts和js一样,类型分为两种:原始数据类型和对象类型 原始数据类型包括:布尔值,数字,字符串,null,undefined 以及es6中的Symbol

基本类型的定义和声明

1.布尔值

    let isDone:boolean = false;

注意:使用构造函数Boolean创造的对象不是布尔值

    let createdNewBoolean:boolean = new Boolean(1);
    //编译错误
    //new Boolean()返回的是一个Boolean对象
    let  let createdNewBoolean:Boolean = new Boolean(1);
    let num:number = 123;
    let str:string = 'I love China';
    let bool:boolean = false;

2.数值

    let decLiteral: number = 6;
    let hexLiteral: number = 0xf00d;
    // ES6 中的二进制表示法
    let binaryLiteral: number = 0b1010;
    // ES6 中的八进制表示法
    let octalLiteral: number = 0o744;
    let notANumber: number = NaN;
    let infinityNumber: number = Infinity;
    //编译后的结果
    var decLiteral = 6;
    var hexLiteral = 0xf00d;
    // ES6 中的二进制表示法
    var binaryLiteral = 10;
    // ES6 中的八进制表示法
    var octalLiteral = 484;
    var notANumber = NaN;
    var infinityNumber = Infinity;

3.空值:JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void 表示没有任何返回值的函数:

    function alertName(): void {
        alert('My name is Tom');
    }

    //声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefined 和 null
    let unusable: void = undefined;
    
     void 类型的变量不能赋值给 number 类型的变量:
     let u: void;
    let num: number = u;
    //// Type 'void' is not assignable to type 'number'.

4.Null 和 Undefined:在 TypeScript 中,可以使用 null 和 undefined 来定义这两个原始数据类型

    // 这样不会报错
    let num: number = undefined;
    
    //  与 void 的区别是,undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量:

    // 这样也不会报错
    let u: undefined;
    let num: number = u;

5.任意类型 any任意值(Any)用来表示允许赋值为任意类型。 什么是任意值类型

    //如果是一个普通类型,在赋值过程中改变类型是不被允许的
    let myFavoriteNumber: string = 'seven';
    myFavoriteNumber = 7;

    // index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
    
    //但如果是 any 类型,则允许被赋值为任意类型。
    let myFavoriteNumber: any = 'seven';
    myFavoriteNumber = 7;

    未声明类型的变量
    变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型
    let something;
    something = 'seven';
    something = 7;
    等价于
    let something: any;
    something = 'seven';
    something = 7;

    something.setName('Tom');

####定义数组的方式

    //第一种方式
    let numArr:number[] = [1,2,3,4,5];
    let strArr:string[] = ['1','2','3'];
    
    //第二种方式
    let arr:Array<number> = [1,2,3,4,5];
    let arr1:Array<string> = ['1','2','4'];

####元组:表示数量和类型已知的数组,也是数组,不过数组的长度,和数组元素的类型是已知的

    let pengStr:[string,number] = ['23',23]

注意:在给元组赋值的时候,长度要保持和声明的长度保持一致,类型要一一对应,不能颠倒

####数组和元组的区别

元组

1.每一项都可以是不同的类型
2.有预定义的长度
3.用于表示一个固定的结构

数组

1.每一项都是同一种类型,除了any类型的数组
2.没有长度限制
3.用于表示一个列表

####枚举

1.普通枚举

1.实现考虑一个变量的所有可能的值,尽量用自然语言中的单词表示它的每一个值,比如性别,月份,星期,颜色,学历,单位等
    enum Gender{
        GIRL,
        BOY
    }
    let g1:Gender = Gender.GIRL
    let g2:Gender = Gender.BOY
    console.log(Gender); //{ '0': 'GIRL', '1': 'BOY', GIRL: 0, BOY: 1 }
    console.log(g1,g2); //0 1;
    
    enum Week{
        MONDAY = 1,
        TUESDAY = 2
        
    }
    console.log(Week); //{ '1': 'MONDAY', '2': 'TUESDAY', MONDAY: 1, TUESDAY: 2 }

注意:默认情况下,枚举类型索引是从0开始的,依次往后推,如果给的值是数字,按顺序赋值,不然乱序

2.常数枚举 常数枚举和普通枚举的区别是,它是在编译阶段被删除,并且不包含计算成员,假如包含了计算成员,则会在编译阶段报错

    const enum Colors {
        Red = 'a',
        Yellow = 'b',
        Green = 'c'
    }
    //console.log(Colors); //报错 不能直接打印这个常量枚举,因为在编译阶段会被删除,只能通过属性来调用,不能直接调用
    console.log(Colors.Red,Colors.Yellow,Colors.Green); //只能这样写
    console.log(Colors[0]); // 也不可以这样写

####never类型 永远不知道什么类型 使用场景 1. 如果一个函数永远不会返回或者陷入死循环,那么他的返回值类型就是never typescript function sum():never{ while(true){ } } 2.如果一个函数一定要抛出一个错误,那它永远不会正常结束,它的返回类型也是一个never typescript function nums():never{ throw Error('我错了') }

#### void 和 never的区别
    1.void可以被赋值为null和undefined,never则是一个不包含值的类型
    2.拥有void返回值类型的函数能正常运行,拥有never类型的返回值类型的函数无法正常返回,无法终止或抛出异常

#### 断言 就是强行告诉ts是一个什么类型,类型断言可以将一个联合类型的变量,指定一个更加具体的类型
```typescript
    let names:number|string|null;
    console.log((names as string).length);
    console.log((names as number).toFixed(2));
```

####字面量类型 可以把字符串,数字,布尔值字面量组成一个联合类型
```typescript
     type zType  = 1|'one'|true;
     let t1:zType = 1;
     let t2:zType = 'one';
     let t3:zType = true;
```
#### 字符串字面量  vs 联合类型
    1.字符串字面量类型用来约束取值只能是某几个个字符串中的一个,联合类型表示取值可以为多种类型中的一种
    2.字符串字面量限定了使用该字面量的地方仅接受特定的值,联合类型对于值并没有限定,仅仅限定值类型需要保持一致