Typescript总结篇(二)
# 一、简介
# 1.1 什么是 TypeScript
TypeScript是JavaScript的一个超集,主要提供了类型系统和对ES6的支持TypeScript是由微软开发的一款开源的编程语言TypeScript是Javascript的超级,遵循最新的ES6、Es5规范。TypeScript扩展了JavaScript的语法TypeScript更像后端java、C#这样的面向对象语言可以让js开发大型企业项目
# 1.2 为什么选择 TypeScript
Typescript和es6、es5关系

TypeScript 增加了代码的可读性和可维护性
- 类型系统实际上是最好的文档,大部分的函数看看类型的定义就可以知道如何使用了
- 可以在编译阶段就发现大部分错误,这总比在运行时候出错好
- 增强了编辑器和
IDE的功能,包括代码补全、接口提示、跳转到定义、重构等
TypeScript 非常包容
TypeScript是JavaScript的超集,.js文件可以直接重命名为.ts即可- 即使不显式的定义类型,也能够自动做出类型推论
- 可以定义从简单到复杂的几乎一切类型
- 即使
TypeScript编译报错,也可以生成JavaScript文件 - 兼容第三方库,即使第三方库不是用
TypeScript写的,也可以编写单独的类型文件供TypeScript读取
TypeScript 拥有活跃的社区
- 大部分第三方库都有提供给
TypeScript的类型定义文件 Google开发的Angular2就是使用TypeScript编写的TypeScript拥抱了ES6规范,也支持部分ESNext草案的规范- 最新的
Vue、React也可以集成TypeScript
TypeScript 的缺点
- 有一定的学习成本,需要理解接口(
Interfaces)、泛型(Generics)、类(Classes)、枚举类型(Enums)等前端工程师可能不是很熟悉的概念 - 短期可能会增加一些开发成本,毕竟要多写一些类型的定义,不过对于一个需要长期维护的项目,
TypeScript能够减少其维护成本 - 集成到构建流程需要一些工作量
- 可能和一些库结合的不是很完美
# 1.3 安装 TypeScript
typescript 安装
npm i typescript -g
全局安装完成后,我们新建一个
hello.ts的ts文件
// hello.ts内容
let a = "poet"
接下来我们在命令行输入
tsc hello.ts来编译这个ts文件,然后会在同级目录生成一个编译好了的hello.js文件
// hello.js内容
var = "poet"
那么我们每次都要输
tsc hello.ts命令来编译,这样很麻烦,能否让它自动编译?答案是可以的,使用vscode来开发,需要配置一下vscode就可以。
首先我们在命令行执行
tsc --init来生成配置文件,然后我们在目录下看到生成了一个tsconfig.json文件

这个
json文件里有很多选项
target是选择编译到什么语法module则是模块类型outDir则是输出目录,可以指定这个参数到指定目录
更多细节 https://zhongsp.gitbooks.io/typescript-handbook/content/doc/handbook/tsconfig.json.html
接下来我们需要开启监控了,在
vscode任务栏中

# 1.4 Hello TypeScript
将以下代码复制到
hello.ts中
function sayHello(person: string) {
return 'Hello, ' + person;
}
let user = 'poetries';
console.log(sayHello(user));
tsc hello.ts
//这时候会生成一个编译好的文件 hello.js:
function sayHello(person) {
return 'Hello, ' + person;
}
var user = 'poetries';
console.log(sayHello(user));
TypeScript中,使用:指定变量的类型,:的前后有没有空格都可以
TypeScript只会进行静态检查,如果发现有错误,编译的时候就会报错TypeScript编译的时候即使报错了,还是会生成编译结果,我们仍然可以使用这个编译之后的文件
# 二、基础
# 2.1 原始数据类型
JavaScript的类型分为两种:原始数据类型(Primitive data types)和对象类型(Object types)。
- 原始数据类型包括:
布尔值、数值、字符串、null、undefined以及ES6中的新类型Symbol。
本节主要介绍前五种原始数据类型在
TypeScript中的应用
# 2.1.1 布尔值
布尔值是最基础的数据类型,在
TypeScript中,使用boolean定义布尔值类型
let isDone: boolean = false;
// 编译通过
// 后面约定,未强调编译错误的代码片段,默认为编译通过
注意,使用构造函数
Boolean创造的对象不是布尔值
let createdByNewBoolean: boolean = new Boolean(1);
// index.ts(1,5): error TS2322: Type 'Boolean' is not assignable to type 'boolean'.
// 后面约定,注释中标出了编译报错的代码片段,表示编译未通过
- 事实上
new Boolean()返回的是一个Boolean对象:
let createdByNewBoolean: Boolean = new Boolean(1);
- 直接调用
Boolean也可以返回一个boolean类型:
let createdByBoolean: boolean = Boolean(1);
- 在
TypeScript中,boolean是JavaScript中的基本类型,而Boolean是JavaScript中的构造函数。其他基本类型(除了null和undefined)一样
# 2.1.2 数值
使用
number定义数值类型
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;
其中
0b1010 和0o744是ES6中的二进制和八进制表示法,它们会被编译为十进制数字
# 2.1.3 字符串
使用
string定义字符串类型:
let myName: string = 'Tom';
let myAge: number = 25;
// 模板字符串
let sentence: string = `Hello, my name is ${myName}.
I'll be ${myAge + 1} years old next month.`;
# 2.1.4 空值
JavaScript没有空值(Void)的概念,在TypeScript中,可以用void表示没有任何返回值的函数
function alertName(): void {
alert('My name is Tom');
}
声明一个
void类型的变量没有什么用,因为你只能将它赋值为undefined和null:
let unusable: void = undefined;
# 2.1.5 Null 和 Undefined
在
TypeScript中,可以使用null和undefined来定义这两个原始数据类型:
let u: undefined = undefined;
let n: null = null;
undefined类型的变量只能被赋值为undefined,null类型的变量只能被赋值为null
- 与
void的区别是,undefined和null是所有类型的子类型。也就是说undefined类型的变量,可以赋值给number类型的变量
// 这样不会报错
let num: number = undefined;
// 这样也不会报错
let u: undefined;
let num: number = u;
而
void类型的变量不能赋值给number类型的变量:
let u: void;
let num: number = u;
// index.ts(2,5): error TS2322: Type 'void' is not assignable to type 'number'.
# 2.2 任意值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 anyThing: any = 'hello';
console.log(anyThing.myName);
console.log(anyThing.myName.firstName);
也允许调用任何方法:
let anyThing: any = 'Tom';
anyThing.setName('Jerry');
anyThing.setName('Jerry').sayHello();
anyThing.myName.setFirstName('Cat');
未声明类型的变量
等价于
# 2.3 类型推论
语法