ts的准备工作
什么是ts
TypeScript是JavaScript的超集,因为它扩展了JavaScript,有JavaScript没有的东西。
硬要以父子类关系来说的话,TypeScript是JavaScript子类,继承的基础上去扩展。
为什么要用ts
简单来说就是因为JavaScript是弱类型, 很多错误只有在运行时才会被发现
而TypeScript提供了一套静态检测机制, 可以帮助我们在编译时就发现错误
ts的特点
支持最新的JavaScript新特特性
支持代码静态检查
支持诸如C,C++,Java,Go等后端语言中的特性 (枚举、泛型、类型转换、命名空间、声明文件、类、接口等)
安装
编译生产js
不编译直接运行
安装一个工具 npm i -g ts-node
ts的语法
声明变量并给它指定类型
类型的别名
用type定义一个类型的别名
1 2
| type mytype = 1 | 2 | 3 let x: mytype = 1
|
函数的类型声明
声明参数的类型及返回值的类型
1 2 3 4 5 6 7 8 9 10
| let d: (a: number, b: number) => number d = function(n1: number, n2: number): number{ return n1 + n2 }
function sum(a:number, b:number):number{ return a+b } let result = sum(a:1,b:3)
|
ts的类型
string number boolean undefined null bigint symbol object (8种内置类型)
9 array(数组) 10 tuple(元组 固定长度 固定类型的数组) 11 enum(枚举)
12 any 13 unknown 14 void 15 never
16 literal(字面量类型) 17 union types联合类型
8 object
{}用来指定对象可以包含哪些属性
1 2 3 4 5
| let b:{name: string, age?:number} b = {name: '孙悟空', age: 18}
let c:{name: string, [propName: string]:any}
|
9 array数组
两种方式
1 2 3 4
| let e: string[] e = ['a','b','c']
let g:Array<string>
|
10 tuple元组
1 2
| let h: [string, number] h = ['hello', 12]
|
11 enum枚举
1 2 3 4 5 6 7 8 9 10 11
| enum Gender{ Male = 1, Female = 0 } let i: {name: string, gender: Gender} i = { name: '孙悟空', gender: Gender.Male } console.log(i.gender === Gender.Male)
|
12 any
表示任意类型,一个变量设置类型为any后相当于对该变量关闭了ts的类型检测,不建议使用any
声明变量如果不指定类型,则ts解析器会自动判断变量的类型为any
13 unknown
表示未知的类型
any和unknown的区别:
any类型的变量可以赋值给其他类型的变量,相当于嚯嚯了别的变量。unknown类型的变量不能直接赋值给其他类型的变量,会报错。
14 void
用来表示空,以函数为例,表示没有返回值的函数
15 never
表示永远不会返回结果
1 2 3
| function fn2():never{ throw new Error(‘error’) }
|
16 literal字面量
限制变量的值就是该字面量的值
1 2
| let a: '男' | '女' a = '男'
|
17 union types联合类型
1 2 3
| let myFavoriteNum: string | number myFavoriteNum = 'seven' myFavoriteNum = 7
|
类型断言
可以告诉解析器变量的实际类型。以下为两种写法:
1 2
| <string>abc abc as string
|
ts的编译选项
-w
tsc index.ts -w 自动监听当index.ts变化时自动编译
tsconfig.json
ts编译器的配置文件,ts编译器可以根据它的信息来对代码进行编译
有了这个文件,只需执行tsc -w可以同时自动编译根目录下的所有ts文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| { "include": ["./src/**/*"], "exclude": [], "files": [],
"compilerOptions": { "target": "ES3", "module": "ES6", "outDir": "./dist", "allowJs": false, "checkJs": false, "removeComments": false, "noEmit":false, "noEmitOnError": false, "strict": false, "alwaysStrict": false, "noImplicitAny": true, "noImplicitThis": false, "strictNullChecks": false, } }
|
面向对象
抽象类 abstract
1 2 3 4 5 6 7 8 9 10 11 12
| abstract class Animal{ name: string constructor(name: string){ this.name = name } abstract say():void eat(){ console.log('eat') } }
|
继承 extends super
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Dog extends Animal{ age: number constructor(name:string, age: number){ super(name) this.age = age } say(){ console.log('汪汪汪') } eat(){ super.eat() } }
|
接口 interface implement
用来定义一个类结构,用来定义一个类中应该包含哪些熟悉和方法,不能有实际值,方法都是抽象方法。
接口和抽象类的区别是抽象类中可以有非抽象的方法,而接口中都是抽象方法。
同时接口也可以当成类型声明去使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| interface myinterface{ name: string, age: number, sayHellow():void }
const obj: myinterface{ name: 'aaa', age: 18, sayHellow(){ console.log('sayHellow') } }
class myClass implements myinterface{ name: string age: number constructor(name: string, age:number){ this.name = name this.age = age } sayHello(){ console.log('hellow') } }
|
属性的封装 private
public 属性默认是公共的
private 私有属性 用getter setter,只能在当前类访问
protected 受保护的,只能在当前类和子类中访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Person{ private _name: string private _age: number
constructor(name: string, age: number){ this._name = name this._age = age } get name(){ return this._name } set name(value: string){ this._name = value } set age(value: number){ if(value > 0) { this._age = value } else { } } }
|
定义类的简写
1 2 3 4
| class Person{ constructor(name: string, age: number){} } let p = new Person('aa',18)
|
泛型
在定义函数或者类时,如果遇到类型不明确就可以使用泛型
不预先指定具体的类型,而是在使用时再指定类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function fn<T>(a: T):T{ return a }
fn(10) fn<string>('hello')
function fn2<T, K>(a: T, b:K):T{ return a }
interface Inter{ length: nuumber } function fn3<T extends Inter>(a: T): number{ return a.length }
|