开始
TypeScript 是 JavaScript 的超集,扩展了 JavaScript 的语法,在 JavaScript 的基础上增加了编译期的类型检查
全局安装 TypeScript 命令:npm i -g typescript
TypeScript 需要先编译为 JavaScript 才能工作,编译命令为 tsc xxx.ts
类型
类型声明
TS 中声明变量,在变量名后加上类型
1 | let a: number = 10; |
若变量在声明时初始化,则进行类型推断,若未初始化且未声明类型,则默认为 Any 类型
1 | // 未初始化且未声明类型,默认类型为Any |
TS 支持字面量类型声明
1 | let a: 10; // a的值只能是10 |
类型声明支持同时声明多个类型(联合类型)
1 | let a: number | string; // a只能是number类型或string类型 |
函数类型声明
- 支持参数类型声明
- 支持返回值类型声明
- 支持限定参数个数
1 | function func(a: number, b: number): number { |
基本类型
-
number
-
string
-
boolean
-
any:任意类型
-
unknown:类型转换安全的 any,在赋值给其他类型时要显式类型检查
1
2
3
4
5
6
7
8let a: unknown;
let s: string;
if (typeof a === "string") {
s = a;
}
// 强制类型转换
s = a as string; -
void:函数无返回值
-
never:函数永远不会返回,类似 kotlin 的 nothing
-
object:对象类型
一个对象类型是通过属性名和属性类型确定
1
let obj: { name: string, age: number }
支持可选属性
1
let obj: { name: string, age?: number }
动态任意属性
1
2// property为任意属性名,属性声明为any类型
let obj: { name: string, [property: string]: any }不同对象的属性混合
1
2// obj是个既有name属性又有age属性的对象类型
let obj: { name: string } & { age: number }; -
函数类型
使用类似 kotlin 的语法声明一个函数类型
1
2
3
4
5
6
7
8let f: (a: number, b: number) => number;
// 函数赋值
function fun(a: number, b: number): number {
return a + b;
}
f = fun;
f = (a, b) => a + b; // 使用lambda表达式 -
array
1
2let arr: number[] = [1, 2, 3, 4];
let arr1: Array<number> = [1, 2, 3, 4]; -
tuple:看做固定长度数组
1
let t: [string, number] = ["Hello", 123];
-
enum:枚举类型
1
2
3
4enum Gender {
Male,
Female
}
类型别名
1 | type MyType = string; |
tsc 编译
使用 tsc --init
命令创建 tsconfig.json 文件,用于配置 tsc 编译
默认配置如下
1 | { |
根对象配置
配置名 | 描述 |
---|---|
include: [] |
选择被编译的文件 |
exclude: [] |
选择排除编译的文件 |
compilerOptions 配置
配置名 | 描述 |
---|---|
target |
指定编译的 JS 版本 |
module |
指定模块化方案 |
lib:[] |
指定项目使用的库,一般不自定义设置 |
outDir |
指定编译输出目录 |
outFile |
将编译结果输出为一个文件 |
allowJs |
是否允许编译 js 文件 |
checkJs |
是否检查 js 代码 |
removeComments |
是否去除注释 |
noEmit |
不输出编译文件 |
noEmitOnError |
当编译错误时,不输出编译文件 |
alwaysStrict |
编译结果是否使用严格模式 |
noImplicitAny |
是否不允许隐式 any 类型 |
noImplicitThis |
是否不允许不明确 this |
strictNullChecks |
是否严格空检查 |
strict |
是否启用所有严格检查 |
面向对象
类
与 js 类相似,基本声明如下
1 | class Person { |
字段封装
-
字段支持访问级别设置:public、private、protected
-
getter 与 setter 方法与 js 相同
1
2
3
4
5
6
7
8
9
10
11
12
13
14// 可提供getter和setter
getName() {
return this.name
}
setName(name) {
this.name = name
}
// 简化语法糖,可简化为属性访问形式
get name() {
return this.name
}
set name(name) {
this.name = name
}
继承
1 | class Animal { |
抽象类
1 | abstract class Person { |
接口
1 | interface MyInterface { |
泛型
泛型函数
泛型函数声明
1 | function func<T>(a: T): T { |
限定泛型参数上界
1 | function func<T extends A>() { |
泛型类
1 | class Person<T> { |
索引签名
可以通过字符串来访问对象的属性
1 | const obj: any = { |
在 typescript 中,索引签名必须是 string
或 number
类型
显式指定索引签名
1 | const foo: { |
与字段声明结合使用
1 | // ok |