-  TypeScript 开发环境搭建 -  下载Node.js -  14.15.1版本64位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x64.msi 
- node官网: Node.js
 
-  
-  安装Node.js 
-  使用npm全局安装typescript -  进入命令行 
-  输入: npm i -g typescript 
 
-  
-  创建一个ts文件 
-  使用tsc对ts文件进行编译 -  进入命令行进入 
-  ts文件所在目录 
-  执行命令:tsc 文件名.ts 
 
-  
 
-  
-  typtscript类型 -  类型声明 -  通过类型声明可以指定TS中变量(参数、形参)的类型 
-  指定类型后,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错 
-  简而言之,类型声明给变量设置了类型,使得变量只能存储某种类型的值 
-  语法: let 变量:类型; let 变量:类型 = 值; function fn(参数:类型,参数:类型):类型{ ... }
 
-  
-  自动类型判断 -  typescriptTS拥有自动的类型判断机制 
-  当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型 
-  所以如果你的变量的声明和赋值时同时进行的,可以省略掉类型声明 
 
-  
-  ts类型 -  常用类型  
-  类型定义: -  字面量:用| 表示或 
-  any: 设置any相当于对该变量关闭了ts检测。可以赋值给其他变量,影响其他变量的类型 --- 避免使用 
-  unknown:表示位置的类型的值。他不能赋值其他类型的值。 -  解决:可以对unknown的值进行类型判断 
 
-  
-  类型断言:可以用来告诉解析器变量的实际类型 -  语法: 变量 as 类型 
-  <类型> 变量 
 
-  
-  void:用来表示为空,主要表示函数返回值为空,返回null也是表示为空 
-  never:表示永远不会返回结果 
-  {}:用来指定对象包含哪些属性 -  语法:{属性:属性值} eg: let b : {name: string} 
-  在属性后加?,表示属性是可选的 eg:let b : {name: string, age?: number } 
-  属性后面加任意:eg: let b : {name: string, [propName: string]: any } 
 
-  
-  设置函数结构的类型声明 -  语法:(形参:类型,形参:类型,...)=> 返回值 
-  eg:let d: (a:number, b:number) => number 
 
-  
-  数组表示: -  表示:类型[] -  let e:string[]; 表示字符串 ; 
-  let f:number[]; 表示数字的数组 
 
-  
-  表示:Array<类型> -  let g: Array<number> 
 
-  
 
-  
-  元组,元组就是固定长度的数组 -  写法:h: [string, string]; h = ['a', 'b'] 
 
-  
-  枚举:enum -  写法: let i : {name:string,gender:string} 
-  enum Gender{male=0,femal=1} 
 
-  
 
-  
-  拓展: -  &:表示同时:let j: { name: string } & { age: number }; 
-  |: -  使用 
-  类型的别名 type myType = 1|2| 3|4| 5; let k: myType;
 
-  
 
-  
 
-  
 
-  
-  编译选项 -  自动编译文件 -  编译文件时,使用 -w 指令后,TS编译器会自动监视文件的变化,并在文件发生变化时对文件进行重新编译。 
-  示例:tsc xxx.ts -w 
 
-  
-  自动编译整个项目 -  如果直接使用tsc指令,则可以自动将当前项目下的所有ts文件编译为js文件。 
-  但是能直接使用tsc命令的前提时,要先在项目根目录下创建一个ts的配置文件 tsconfig. 
-  jsontsconfig.json是一个JSON文件,添加配置文件后,只需只需 tsc 命令即可完成对整个项目的编译 
-  配置选项:在tsconfig.json文件 -  include -  定义希望被编译文件所在的目录 
-  默认值:["/*"] 
-  **示例: -  "include": ["src//", "tests/**/"] 
-  上述示例中,所有src目录和tests目录下的文件都会被编译 
 
-  
 
-  
-  exclude -  定义需要排除在外的目录 
-  默认值: ["node_modules", "bower_components", "jspm_packages"] 
-  示例: 
 
-  
-  compilerOptions -  编译选项是配置文件中非常重要也比较复杂的配置选项 
-  在compilerOptions中包含多个子选项,用来完成对编译的配置 -  项目选项 -  target -  设置ts代码编译的目标版本 
-  可选值:ES3 (默认)、ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、ESNext 
-  示例:compilerOptions": {"target": "ES6"} 
-  如上设置,我们所编写的ts代码将会被编译为ES6版本的js代码 
 
-  
-  lib -  指定代码运行时所包含的库(宿主环境) 
-  可选值:ES5、ES6/ES2015、 ES7/ES2016、ES2017、ES2018、 ES2019、ES2020、 ESNext、 DOM、WebWorker、 ScriptHost 
-  示例:{"lib": ["es6", "DOM"]} 
 
-  
-  outDir -  用来指定编译后文件所在目录 
-  可选值: 
-  示例: 
 
-  
-  outFile --- 用的不多 -  将代码合并为一个文件 
 
-  
-  allowJS -  是否对js文件进行编译,默认为false 
 
-  
-  checkJS -  是否检查js代码是否符合语法规范 
 
-  
-  removeComments: -  是否移除注释 
 
-  
-  noEmit: -  不生成编译后的文件 
 
-  
 
-  
 
-  
 
-  
 
-  
 
-  
 
-  
-  类的介绍 -  属性的定义: -  实例属性: p.name 
-  类属性:Person.name -  eg: readonly name:string = 'zhangsan' 
 
-  
 
-  
-  方法的定义: -  实例方法:p.learn() 
-  类方法:Person.learn() 
-  构造函数 -  属性直接在类中定义 
-  赋值是在类的构造函数赋值的:constructor(){} class Person { name: string, age: number, constructor(name:string, age:number){ // this表示当前对象的实例对象 this.name = name; this.age = age; } eat(){ console.log('吃饭') } } const p1 = new Person(name: 'zhangsan', age: 18); const p2 = new Person(name:'lisi', age: 30); p1.eat();
 
-  
 
-  
 
-  
-  继承 -  Dog extends Animal -  此时,Animal被称为父类,Dog被称为子类 
-  使用继承后,子类将会拥有父类所有的方法和属性- 
-  通过继承可以将多个类中共有的代码写在一个父类中, -  这样只需要写一次即可让所有的子类都同时拥有父类中的属性 
-  如果希望在子类中添加父类中没有的属性或方法,直接加就行 
-  如果不满足父类中的方法,可以在本类中做重写(这种子类覆盖掉父类方法的形式,就是方法的重写) 
 
-  
-  父类也叫做超类,super class Animal { name: string; constructor(name: string) { this.name = name; } sayHello() { console.log('在说话'); } } class Dog extends Animal{ age: number; constructor(name: string,age:number){ // 如果在子类中写了构造函数,在子类构造函数必须对父类构造函数进行调用 super(); // 调用父类构造函数 this.age = age; } sayHello() { // 在类的方法中 super就表示当前类的父类 //super.sayHello(); console.log('汪汪汪') } } const dog = new Dog(name:'阿黄',age: 3);
-  抽象类 -  以abstract开头的类是抽象类,抽象类和其他类区别不大,只是不能用来创建对象抽象类就是专门用来被继承的关 
-  作用:不能被创建实例 
-  特点:可以创建抽象方法,通用方法 
-  抽象方法: -  定义一个抽象方法 
-  抽象方法使用 abstract开头,没有方法体 
-  抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写 abstract class Animal { name: string; constructor(name: string) { this.name = name; } abstract sayHello():void; }
-  子类需要重写父类的抽象方法 
 
-  
 
-  
 
-  
 
-  
-  定义接口:interface -  描述一个对象类型(使用别名) ----- 只能声明一个 abstract class Animal { name: string; constructor(name: string) { this.name = name; } abstract sayHello():void; }
-  接口用来定义一个类结构(使用interface) ---- 可以声明多个 interface myInterface{ name: string; age: number; } interface myInterface{ gender: string; }  const obj: myInterface = { name: 'sss', age: 111, gender:'男' };注意:接口中的所有属性都不能有实际的值,接口值定义对象的结构,而不考虑实际的值。在接口中定义的方法都是抽象方法 
-  定义类时,可以使类去实现一个接口,实现接口就是使类满足接口的要求 
-  作用:接口主要是对类的定义规范 
 
-  
-  泛型: -  在定义函数或是类时,如果遇到类型不明确就可以使用泛型 function fn<T>(a:T):T{ return a; }
-  可以直接调用具有泛型的函数 -  不指定泛型:fn(a:10); 
-  指定泛型:fn<string>(a: 'hellow'); 
 
-  
-  可以传多个参数 function fn2<T, K>(a: T, b: K):T{ console.log(b); return a; } fn2<number, string>(a: 123, b: 'hello');
-  可以使用interface:T extends Inter 表示泛型T必须是Inter实现类(子类) interface Inter{ length: number; } function fn3<T extends Inter>(a: T): number{ return a.length; } fn3( a: 10);
 
-  



















