typescript基础学习
1. typescript的环境搭建
- 在node.js 官网下载node.js 的稳定版,最新版本也可以,
- 安装好node后再 安装 typescript
npm install -g typescript - 创建一个.ts结尾的文件
- 在命令行运行
tsc xxx.ts
2.typescript的基础数据类型
| 类型 | 例子 | 描述 |
|---|---|---|
| 数字 number | 1,12.14 | 任意数字 |
| 布尔值 boolean | 布尔值true和false | |
| 字符串 string | 任意字符串 | |
| 字面量 | 其本身 | 申明时的类型 |
| any | 任意类型 | |
| unknown | 任意类型 | |
| void | 空值 | 没有值(或是Undefined) |
| Never | 没有值 | 不能是任意值 |
| object | {name:'tom'} | 任意js对象 |
| 数组 array | 任意数组 | |
| 元组 Tuple | [4,5] | 元素,TS新增类型,固定长度数数组 |
| 枚举enum | enum[4,1] | 枚举,TS刑新增类型 |
3.typescript的类型申明
-
直接字面量的形式
let a: 10; let b:false -
联合类型:
let sex: "male" | "female"; let c: boolean | string; c = true; c = "hello" c = 10 //c 赋值10就会报错 -
any类型
any在typescript中可以赋值任意类型 在类型不确定的情况下可以使用any
let notSure: any = 4; notSure = "hello"; notSure = true; //any类型可以赋值任何类型, let anyStr: any; anyStr = "hello"; anyStr = false; anyStr = 10; let s: number; s = anyStr; -
unknown类型
unknown类型可以是任意类型的值,
let e: unknown; e = 'hello'; e = true; let a: string; //将e赋值个a会报错 a = e; -
Void和Never一般用于在函数没有返回值的情况下。
- nerver
function fn(): never { throw new error('error') }-
void 返回一个空值
function fu2(): void{ }
-
obj类型
-
用来定义对象的结构体
let obj: { name: string }; obj = { name: "tom"} //这样个给obj赋值可以 //但是 obj = {name:"zhangsan",age:18}//这样就会报错,表示age:18不在obj:{name:string}类型中 //在属性后面加一个?表示可以选的 let obj: { name: string, age?: number }; obj = { name: "tom" } //如果想添加其他的类型可以这样定义,name属性是必须要有的。如果没有name属性就会报错 let obj: { name: string, [proName:string]:any}; obj = { name: "tom", age: 18, flag:true } -
用来定义函数的结构体
let obj2: (x: number, y: number) => number; //定义结构 obj2 = function (n1:number, n2:number,) { return n1 + n2 } //如果结构体不符合就会报错 obj2= function(n1:string,n2:number){ //这就会报错 return n1+n2 }
-
-
数组array
申明数组是需要有数组类型
//定义数组 let arr: string[] = ['hello', 'string'] //只能是字符串 let arr2: Array<number>; arr2 = [1,45,41] //数组中只能存放数字 -
元组 Tuple(固定长度的数组)
let arr3: [string, string]; //定义一个元组 arr3 = ['hello', 'string'] //数组里面只能存放两个字符串,多了不行,其他类型也不行 arr3 = ['hello',12] //报错 -
枚举类型 enum,多个值从中选一个值的场景
//定义枚举 enum Gender { male, female } let person: { name: string, gender: Gender } person = {name:'tom',gender:Gender.male} -
类型断言
-
类型断言的使用
a = e as string a = <string>e;
-
4.tsconfig.josn的常用配置
{
"include": [ //需要编译的文件
"./src/**/*"
],
"exclude": [ //不需要编译的ts文件
"./util/**/*"
],
"compilerOptions": { //编译器的选项
"target": "ES2015", //用来指定ts被编译为ES的版本
"module": "ES2015" , //指定使用的模块化的规则 ,例如es2015,common.js等
//"lib": [] //一般不用,可选的参数是:'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'es2021', 'es2022', 'esnext', 'dom', 'dom.iterable'....
"outDir": "./dist", //ts编译后的文件目录
"outFile": "./dist/app.js", //全局作用域的文件合并为一个js文件
"allowJs": false, //是否编译js文件
"checkJs": false, //检查js文件语法规范
"removeComments": false, //删除所有注释,除了以 /!*开头的版权信息
"noEmit": false, //不生成编译文件
"noEmitOnError": false, //报错时不生编译文件。
"alwaysStrict": false, //编译后的文件是否我验证模式"use strict"
"noImplicitAny": true, //不允许有隐式的any类型
"noImplicitThis": true,//检查不明确的this
"strictNullChecks": true, //严格检查空值
"strict": true,//启用所有严格类型检查选项。
//启用 --strict相当于启用 --noImplicitAny, --noImplicitThis, --alwaysStrict, ///--strictNullChecks和 --strictFunctionTypes和--strictPropertyInitialization。
}
}
5.typescript的类
-
使用关键字
class来创建一个对象,使用new实例化一个对象class Dog { // 对象的属性 name: string age: number constructor(name: string, age: number) { //使用构成函数实现传参 this.name = name; this.age = age } //定义一个方法 greet() { return this.name } } //实例化一个对象 const xb = new Dog('小白', 2) -
类的继承
extends和super关键字// 一个动物类 class Animal { name: string age: number constructor(name: string, age: number) { this.name = name this.age = age } //定义方法 say() { console.log("动物叫~") } } class Dog extends Animal { color: string constructor(name: string, age: number, color: string,) { super(name, age) this.color = color } say() { console.log('旺~旺~旺') } playFrisbee() { //自已特有的方法 console.log("可以玩飞盘") } } const xiaobai = new Dog('小白', 4, '斑点狗'); class Cat extends Animal { say() { console.log('喵喵喵!') } } const miao = new Cat('喵', 3); -
抽象类
abstract开头定义的类就抽象类// 一个动物抽象类型 abstract class Animal { name: string age: number constructor(name: string, age: number) { this.name = name this.age = age } //定义方法 say() { console.log("动物叫~") } } //如果用Animal创建实例就会报错 const snake = new Animal('小蛇',1) //报错 -
抽象方法实例对象在继承抽象类时,必须要实现抽象法法
// 一个动物抽象类型 abstract class Animal { name: string age: number constructor(name: string, age: number) { this.name = name this.age = age } //定义方法 say() { console.log("动物叫~") } //抽象方法 abstract sayHillo(): void } class Dog extends Animal { color: string constructor(name: string, age: number, color: string,) { super(name, age) this.color = color } //必须要实现抽象类的抽象方法 sayHillo(): void { console.log('抽象类的方法') } say() { console.log('旺~旺~旺') } playFrisbee() { //自已特有的方法 console.log("可以玩飞盘") } } const xiaobai = new Dog('小白', 4, '斑点狗');
6.接口 (用来定义一个类的结构,定义一个类中包含了那些属性和方法,同时还可以当类型声明来使用)
定义接口中的所有属性不能有实际的值,所有的方方法都是抽象方法,
//定义一个接口
interface myInterface {
name: string,
age: number
}
//可以定义多个 接口
const obj: myInterface = { //申明 myInterface 中必须包含name,age属性
name: 'zhangsna',
age: 18
}
可以通过类实现一个接口
interface myInter {
name: string,
play(): void
}
class Animal implements myInter {
name: string
constructor(name: string) {
this.name = name
}
play(): void {
console.log('say hello')
}
}
7.泛型(泛型类可以是多个,也可以是一个接口或类)
//typescript的泛型 同时定义多个泛型
function fn2<T, K>(arg1: T, arg2: K): void {
console.log(arg1)
console.log(arg2)
}
fn2<string, number>('hllo', 124)
//泛型类型是一个接口
interface num {
length: number
}
function fn3<T extends num>(arg: T): number {
return arg.length
}
fn3('hello');