简单介绍
TypeScript 扩展了JavaScript语法,任何已经存在的JavaScript程序,可以不加任何改动,在TypeScript环境下运行。TypeScript只是向JavaScript添加了一些新的遵循ES6规范的语法,以及基于类的面向对象编程的这种特性
优势
基础
JavaScript 的类型分为两种:原始数据类型(Primitive data types)
和对象类型(Object types)
。
原始数据类型包括:布尔值、数值、字符串、null、undefined 以及 ES6 中的新类型 Symbol。
这些类型在typescript中的定义
1 | //布尔值 在 TypeScript 中,boolean 是 JavaScript 中的基本类型,而 Boolean 是 JavaScript 中的构造函数。 |
任意值
Any
用来表示允许赋值为任意类型
在任意值上访问任何属性都是允许的1
2let testAny: any = 'seven'
testAny = 7
变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型:
1
2
3let test
test = 'seven'
test = 7
类型推断
在ts中,会根据你赋初值来进行类型推断1
2
3let test = '1111'
test = 7
//index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'
上面的代码等价于1
2let test: string = '1111'
test = 7
对象类型-接口
可以使用接口(Interfaces)来定义对象的类型、1
2
3
4
5
6
7
8
9interface Person {
name: string;
age: number;
}
let tom: Person = {
name: 'Tom',
age: 25
}
联合类型
联合类型(Union Types)表示取值可以为多种类型中的一种1
2
3let test: string | number
test = 'seven'
test = 7
数组类型
数组类型有多种定义方式,比较灵活
- 最简单的方法是使用「类型 + 方括号」来表示数组:
1 | let test: number[] = [1, 1, 2, 3, 5] |
- 也可以使用数组泛型(Array Generic) Array
来表示数组
1 | let test: Array<number> = [1, 1, 2, 3, 5]; |
any 在数组中的应用
1
let test: any[] = ['dd', 25, { ddd: 'ddd' }]
接口也可以用来描述数组:
1 | interface test { |
函数类型
1 | //函数声明 |
在tys中可以对输入和输出类型进行控制
1
2
3
4function sum (x: number, y: number): number {
return x + y;
}
通过这种输入只能输入两个,输入少于或多余2都会报错,定义参数可传可不传请继续往下看吧在ts中,函数表达式还可以这样子
1
2
3
4
5
6
7let sum = function (x: number, y: number): number {
return x + y;
}
也可以
let sum: (x: number, y: number) => number = function (x: number, y: number): number {
return x + y;
}
【注意】
在ts中的=>和es6中的=>不一样
符号 | ts | es6 |
---|---|---|
=> | 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型 | 箭头函数 |
- 接口定义函数的情况
1 | interface Fun { |
- 前面说函数入参少传或多穿都会报错,可以通过?来判断参数选择传递
1
2
3
4
5
6
7
8
function sum (x: number, y?: number) {
if (y) {
return x + y
} else {
return x
}
}
[注意]
可选参数必须接在必需参数后面,也就是说 可选参数后面不允许再出现必须参数了
- 参数默认值的情况
1 | function sum(x: number = 2, y: number = 1) { |
- 多余参数
在es6中可以通过…rest来解析多余的参数1
2
3
4
5
6
7
8
9
10
11
12
13function push (array, ...rest) {
rest.forEach( function (item) {
array.push(item)
})
}
实际上rest就是一个数组
可以这样子
function push (array: any[], ...rest: any[]) {
rest.forEach(function(item) {
array.push(item)
})
}
注意,rest 参数只能是最后一个参数,和es6一样
- 重载
重载允许一个函数接受不同数量或类型的参数时,作出不同的处理1
2
3
4
5
6
7
8
9
10
11
12function reverse (x: number): number
function reverse (x: string): string
function reverse (x: number | string): number | string {
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''))
} else if (typeof x === 'string') {
return x.split('').reverse().join('');
}
}
上例中,我们重复定义了多次函数 reverse,前几次都是函数定义,最后一次是函数实现。
如果前面两个不定义,就会有一个缺点,就是不能够精确的表达,输入为数字的时候,输出也应该为数字,输入为字符串的时候,输出也应该为字符串。
注意,ts 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面
类型断言
可以用来手动指定一个值的类型 语法就是<type>name
type就是类型
声明文件
当使用第三方库时,我们需要引用它的声明文件
- 声明语句
我们通常使用jQuery是下面这样1
2$('#test');
jQuery('#test');
但是在 ts 中,我们并不知道 $ 或 jQuery 是什么东西
这时,我们需要使用 declare 关键字来定义它的类型,帮助 ts 判断我们传入的参数类型对不对1
2
3declare let jQuery: (string) => any
jQuery('#foo')
习惯写法是讲声明文件放在一个js里面,其他页面有用需要///引入就行了
1 | //a.js |
内置对象
ts也有很多内置对象,需要可以去mdn上面查看