关于TypeScript

TypeScript 是 JavaScript 的一个超集,主要提供了类型系统对 ES6 的支持,它由 Microsoft 开发,代码开源于 GitHub 上。

它的第一个版本发布于 2012 年 10 月,经历了多次更新后,现在已成为前端社区中不可忽视的力量,不仅在 Microsoft 内部得到广泛运用,而且 Google 的 Angular2 也使用了 TypeScript 作为开发语言。

前言

  1. 学习TypeScript需要前置学习JavaScript,了解Node.js,并会使用npm安装及使用一些工具

    推荐阅读:

    《JavaScirpt高级程序设计》

    《ECMAScript 6 入门》

    《TypeScript入门》

  2. TypeScript学习曲线较其他编程语言来说较为平滑,引用TypeScript设计者 Anders Hejlsberg 的话:“如果你懂得 JavaScript,那么你就已经懂得 TypeScript 了。

  3. JavaScirpt是标准,但是TypeScript不是。现在的TypeScript紧随ECMAScript的定义,几乎实现了Stage 3所有提案,也就是说你使用JavaScirpt也就是使用最新的JavaScript。

安装TypeScript

1
npm install -g typescript

以上命令可以在全局环境安装TypeScript,安装完成之后我们可以在所有地方使用tsc命令来编译.ts文件成.js文件。

基础数据类型

JavaScript数据类型分为两种:原始数据类型和对象数据类型

原始数据类型分为五种:

  • 布尔值

  • 数值

  • 字符串

  • null

  • Undefined

  • ES6中的新类型Symbol

布尔值

在TypeScript中定义boolean值:

1
let falg: boolean = false;

注意:Boolean()构造函数返回的不是布尔值而是Boolean对象

1
let createByNewBoolean: boolean = new Boolean(1)

事实上new Boolean()构造函数是可以返回布尔值的:

1
let createByBoolean: boolean = Boolean(1)

数值

TypeScript使用number定义数值类型:

1
2
3
4
5
6
let decLiteral: number = 1;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;
let notANumber: number = NaN;
let infinityNumber: number = Infinity;

字符串

TypeScript使用string定义字符串类型

1
let myName: string = 'Oven';

其中TypeScript有一个模板字符串语法

1
le t sentence: string = `Hello ${name}`

这个语句编译成js后:

1
var sentence = "Hello " + name;

其中`用来定义ES6 中的模板字符串,${expr}用来在模板字符串中嵌套表达式

空值

在JavaScript中没有空值的概念,但在TypeScript中可以使用void表示没有返回值的函数:

1
2
3
function alterName(): void {
alert('My Name is Oven')
}

声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefinednull

1
let unusable: void = undefined;

Null 和 Undefined

在 TypeScript 中,可以使用 nullundefined 来定义这两个原始数据类型:

1
2
let u: undefined = undefined;
let n: null = null;

void 的区别是,undefinednull 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量:

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

void 类型的变量不能赋值给 number 类型的变量:

1
2
3
let u: void;
let num: number = u;
// Type 'void' is not assignable to type 'number'.

类型推论