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;
任意值的属性和方法
在任意值上访问任何属性都是允许的,也允许调用任何方法。可以认为,**声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。**
未声明类型的变量
变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型。