TypeScript 原始数据类型


作者:Seiya

时间:2019年05月27日


前言

TypeScript 是微软开发一款开源的编程语言,本质上是向 JavaScript 增加静态类型系统。它在语法设计上首先考虑的就是兼容 JavaScript,或者说对 JavaScript 的语法做扩展,基本上是在 JavaScript 的基础之上增加了一些类型标记语法,以实现静态类型分析。它是 JavaScript 的超集,所有现有的 JavaScript 都可以不加改变就在其中使用。它是为大型软件开发而设计的,它最终编译产生 JavaScript,所以可以运行在浏览器、`Node.js`` 等等的运行时环境。



原始数据类型

JavaScript 的类型分为两种:原始数据类型(Primitive data types)和 对象类型(Object types)。

原始数据类型包括:

布尔值、数值、字符串、null、undefined 以及 ES6 中的新类型 Symbol。


  • 布尔值(boolean)

    	布尔值是最基础的数据类型,在 `TypeScript` 中,使用 `boolean` 定义布尔值类型:
    
    	```ts
    	let isDone: boolean = false;
    	```
    
    	<br>
    
    	::: warning 注意:使用构造函数 Boolean 创造的是对象不是布尔值
    	let createdByNewBoolean: boolean = new Boolean(1);
    
    	// index.ts(1,5): error TS2322: Type 'Boolean' is not assignable to type 'boolean'.
    	:::
    
    	在 `JavaScript` `中,boolean` 是 `JavaScript` 中的基本类型,而 `Boolean` 是 `JavaScript` 中的构造函数。其他基本类型(除了 `null` 和 `undefined` )一样,不再赘述。
    

  • 数值(number)

    	```ts
    	let decLiteral: number = 6;
    	let hexLiteral: number = 0xf00d;
    	let binaryLiteral: number = 0b1010;		// ES6 中的二进制表示法
    	let octalLiteral: number = 0o744;		// ES6 中的八进制表示法
    	let notANumber: number = NaN;
    	let infinityNumber: number = Infinity;
    
    	// 编译结果
    	var decLiteral = 6;
    	var hexLiteral = 0xf00d;
    	var binaryLiteral = 10;
    	var octalLiteral = 484;
    	var notANumber = NaN;
    	var infinityNumber = Infinity;
    	```
    
    	::: warning 注意:
    	其中 0b1010 和 0o744 是 ES6 中的二进制和八进制表示法,它们会被编译为十进制数字。
    	:::
    

  • 字符串(string)

    	```ts
    	// 模板字符串
    	let sentence: string = `Hello, my name is ${myName}.
    	I'll be ${myAge + 1} years old next month.`;
    
    	// 编译结果
    	var sentence = "Hello, my name is " + myName + ".\nI'll be " + (myAge + 1) +
    					" years old next month.";
    	```
    
    	::: warning 注意:
    	其中 ` 用来定义 ES6 中的模板字符串,当定义多行字符串时,结尾的换行符也会进行编译。${expr} 用来在模板字符串中嵌入表达式。
    	:::
    

  • 空值(null)

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

    alert('My name is Tom'); }

    
        	::: warning 注意:
        	声明一个 `void` 类型的变量没有什么用,因为你只能将它赋值为 `undefined` 和 `null`。
        	:::
    
    

  • Null 和 Undefined

    	在 `TypeScript` 中,可以使用 `null` 和 `undefined` 来定义这两个原始数据类型:
    
    	```ts
    	let u: undefined = undefined;
    	let n: null = null;
    	```
    
    	::: warning 注意:
    	`undefined` 类型的变量只能被赋值为 `undefined`,`null` 类型的变量只能被赋值为 `null`。
    	:::
    
    	<br>
    
    	与 `void` 的区别是,`undefined` 和 `null` 是所有类型的子类型。也就是说 `undefined` 类型的变量,可以赋值给 `number` 类型的变量,而 `void` 类型的变量不能赋值给 `number` 类型的变量
    
    	```ts
    	// 这样不会报错
    	let num: number = undefined;
    
    	let u: void;
    	let num: number = u;
    	// index.ts(2,5): error TS2322: Type 'void' is not assignable to type 'number'.
    	```
    

  • sympol

    	`ES5` 的对象属性名都是字符串,这容易造成属性名的冲突。所以 `ES6` 引入了 `Symbol` 类型,保证每个属性的名字都是独一无二的,这样就从根本上防止属性名的冲突。
    
    	`Symbol` 值通过 `Symbol` 函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 `Symbol` 类型。凡是属性名属于 `Symbol` 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
    
    	```ts
    	let s = Symbol();
    
    	typeof s
    	// "symbol"
    	```
    
    	::: warning 注意:
    	`Symbol` 函数前不能使用new命令,否则会报错。这是因为生成的 `Symbol` 是一个原始类型的值,不是对象。也就是说,由于 `Symbol` 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
    	:::
    



任意值

任意值(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;

  • 任意值的属性和方法

    	在任意值上访问任何属性都是允许的,也允许调用任何方法。可以认为,**声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。**
    

  • 未声明类型的变量

    	变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型。
    
最后更新时间: 2019-7-31 18:23:33