1. 数据类型

JavaScript的数据类型分为两类:原始数据类型(Primitive data types) 和对象数据类型(Object types)。原始数据类型包括: booleannumberstringnullundefined以及ES6中新的数据类型 Symbol和 ES10数据类型 BigInt

2. 数据类型应用

  1. 布尔型(boolean
    1. let isOneline : boolean = false ;
    注意,如果使用构造函数Boolean创建的事对象而不是原始类型的布尔值。
    1. let isNew: boolean = new Boolean(1) ;
    编译 tsc data.ts,提示错误,使用构造函数创建的为对象,并不是boolean类型值。
    1. data.ts:3:5 - error TS2322: Type 'Boolean' is not assignable to type 'boolean'.
    2. 'boolean' is a primitive, but 'Boolean' is a wrapper object. Prefer using 'boolean' when possible.
    b. 数值(number
    1. // 十进制
    2. let literal: number = 6 ;
    3. //十六进制
    4. let hexLiteral: number = 0xf00d
    5. // 二进制
    6. let binarLiteral: number = 0b1010
    7. //八进制
    8. let octalLiteral: number = 0o774
    9. //不是数值
    10. let notNumber = NaN
    11. //无穷大
    12. let infinityNumber = Infinity
    编译tsc data.ts 生成js文件
    1. // 十进制
    2. var literal = 6;
    3. //十六进制
    4. var hexLiteral = 0xf00d;
    5. // 二进制
    6. var binarLiteral = 10;
    7. //八进制
    8. var octalLiteral = 508;
    9. //不是数值
    10. var notNumber = NaN;
    11. //无穷大
    12. var infinityNumber = Infinity;
    c. 字符串(string) ```javascript let myName: string = ‘LelandACM’ ;

let myAge: number = 30

//模板字符串 let setence : string = Hello, my name is ${myName}. I'll be ${myAge + 1} years old next month.;

  1. 编译 `tsc data.ts` 生成`js`文件,其中```用来定义模板字符串,`${expr}`用来在模板字符串嵌入表达式。
  2. ```javascript
  3. var myName = 'LelandACM';
  4. var myAge = 30;
  5. //模板字符串
  6. var setence = "Hello, my name is ".concat(myName, ". I'll be ").concat(myAge + 1, " years old next month.");
  1. d. 空值(`void`)<br />`JavaScript`总没有空值的概念,在`TypeScript`中,可以用`void`表示没有任何返回值的函数。
  1. function alterName(): void{
  2. alert("My name is Tom") ;
  3. }

e. nullundefined类型
TypeScriptJavaScript中,nullundefined类型是所有类型的子类型,也就是说任意变量的赋值可以赋值为 nullundefined

  1. //undefined类型
  2. let u: undefined = undefined;
  3. //null类型
  4. let n: null = null;
  5. //number
  6. let num: number = undefined
  7. let nullNum = n
  8. //void类型变量不能赋值给number
  9. let v: void;
  10. //- error TS2322: Type 'void' is not assignable to type 'number'.
  11. let voidNum: number = v;
  1. f. 任意值(`any`
  1. let anyThing: any = 'Hello'
  2. anyThing = 7

在任意值上访问任何属性和方法都是允许的

  1. //定义任意值类型
  2. let anyThing: any = 'Hello'
  3. //改变值类型
  4. anyThing = 7
  5. anyThing = 'LelandACM';
  6. //访问任意值属性
  7. console.log(anyThing.myName) ;
  8. console.log(anyThing.myName.firstName);
  9. //访问任意类型的方法
  10. anyThing.setName('Jerry') ;
  11. anyThing.setName('Jerry').sayHello() ;
  12. anyThing.myName.setFirstName('Cat') ;

在变量声明时未指定其类型,则会自动识别为任意值类型。

  1. let something;
  2. something = 'seven'
  3. something = 7 ;
  4. something.setName('Tom')

等价于如下:

  1. let something: any;
  2. something = 'seven'
  3. something = 7;
  4. something.setName('Tom')

g. 类型推断
如果变量在定义时未指定其数据类型,但是赋初值了,那么TypeScript会依照类型推论(Type Inference)的规则推断出一个类型。

  1. // 类型推断
  2. let myNumber = 'seven' ;
  3. //改变值类型
  4. myNumber = 7 ;
  5. //编译器会提示错误
  6. data.ts:63:1 - error TS2322: Type 'number' is not assignable to type 'string'.

h. 联合类型(Union Type)
联合类型表示取值可以为多种类型中的一种。

  1. // 联合类型
  2. let myNumber: string | number;
  3. myNumber = 'seven' ;
  4. myNumber = 7 ;
  5. // 错误类型转换
  6. myNumber = true
  7. //编译器会提示错误
  8. - error TS2322: Type 'boolean' is not assignable to type 'string | number'.

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

  1. function getLength(something: string | number): number{
  2. return something.length ;
  3. }

上述示例中,length不是stringnumber的共有属性,所以会报错。访问共有的属性或方法是可行的。

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

联合类型的变量在赋值时,也会根据类型推论规则得出一个数据类型。

  1. let my: string | number ;
  2. my = 'seven' ;
  3. console.log(my.length) ; //结果输出5
  4. my = 7;
  5. //my 类型自动推断为number,没有legth属性,编译器会提示错误
  6. console.log(my.length) ;
  7. //编译报错
  8. - error TS2339: Property 'length' does not exist on type 'number'.

上述示例中,my被推断为string,访问length属性是OK的,后续my被推断为number,访问length属性报错,number类型数据无length属性。