typescript
1.什么是typescript, js的超集
2.为什么需要typescript ,有类型约束 适合中大型项目,很方便
3.ts环境搭建
- npm i typescript -g tsc —version 能看到版本号就是安装好了
- tsc —init 会产生一个 tsconfig.json文件
- “outDir” : “./dist”
- “rootDir”: “./src”
- 在src .ts下写代码
- dist/运行.ts文件
类型的约束
- string \ number \ boolean \ null :object类型,代表空,代表一个空对象指针 \ undefined : undefined 类型 未定义 \ any 任何类型,一维,放弃了类型的约束
自动类型推断
- a=’abc’
数组的约束
- let arr:number[] =[1,2,3,4];
- let arr2:Array
=[5,6,7];
元组 Tuple约束数组中的每一个元素[number,string] 类似如此
- let arr3:[boolean,string]=[false,’www’];
any 任何类型,意味放弃了类型的约束
void 表示没有任何返回值
联合类型
- | let id= string|number;
交叉类型
1、interface IPerson {
id:number,
name:string
}2、interface ICoder{
lang:string
}3、type IDev = IPerson & ICoder;
- 4、let zst:IDev ={id:111,name:’zst’,lang:’js’};
枚举
enum route {add=1,code=404,every=500}可以通过route.add拿到1;
断言 assert 变量 as 类型 <类型>变量
function getLength(a:string|number){// if(typeof a==="string"){// return a.length;// }// else{// return a.toString().length// }//return (a as string).length//return (<string>a).lengthif((<string>a).length){return (a as string).length}else{return a.toString().length}}console.log(getLength(123));var el:HTMLDivElement|null=null;el=document.getElementById("box") as HTMLDivElement;console.log(el.innerHTML)
泛型 接口泛型 函数泛型
function fun<T>(x:T):T{return x;}var d=fun<string>("555")//泛型类class Pereson<T>{ //泛型类id:Tname:stringconstructor(id:T,name:string){this.name=name;this.id=id}}var p=new Pereson<number>(11,"sss")
class
1.类的构造函数的重载class Test{name:string,age:number,constructor(name:string,age:number)constructor(name:string)constructor(name:any='',age:any=18){//构造函数this.name=name;this.age=age;}}2.setter(public) setName(参数:类型){this:类的私有属性=参数}gettergetName(){return this.name;}3.权限修饰符private 类的内部才能访问public (默认的) 类的内部外部子类都可以访问protected 受保护的 类和子类可以访问,外部不可以访问;4.类的静态成员5.抽象类关键字 abstractabstract class Animal{//抽象类不能实例化,继承抽象类实现抽象方法abstract say():void;}class Cat extends Animal{say():void{}}
interface IProgramer extends IPerson {当前定义属性}
函数的类型约束
function 函数的名字(参数,类型.....):返回值的类型{return 返回值的类型}let mySum :(x:number,y:number)=>number=function(x:number,y:number):number{return x+y;}//也可以简写为let mySum = function (x:number,y:number):number{//自动推断return x+y;}//函数接口interface IFun{(x:number,y:number):number;}let sum3:IFun=(x:number,y:number):number=>x+y;//可以简写为let sum2 = (x:number,y:number):number =>x+y ;//自行判断//函数参数的默认值function show(name:string,age:number=20):string{return "name"+name+"age"+age}//函数的可选参数function showinfo(name:string,age?:number){if(age){return `nume${name}age${age}`}else{return `name${name}`}}//函数的默认参数function show (name:string ,age:number=20):string{return 'name':name+","+age+'age'}//函数的剩余参数function sum(...arr:number[]){return arr.reduce((a,b)=>a+b)}//函数重载function sum9(x:number,y:number):numberfunction sum9(x:string,y:string):stringfunction sum9(x:any,y:any):any{if(typeof x==="string"){return x+"---"+y}else{return x+y;}}//接口对函数的约束interface Ifun {(x:number,y:number):number}let sum3:Ifun =(x:number,y:number):number=>x+y;可简写为let sum3=(x:number,y:number):number=>x+y;函数参数的默认值
修饰器模式:设计模式 。 给代码打扮
- 函数和 class类 :属性 方法(功能)
- 添加功能 (函数形式去添加功能)
//1.装饰器本身就是一个函数//2.它的参数是构造函数//3.可以通过这个构造器去添加修饰的方法//4.通过@符号调用//修饰器虽然是函数,但是不能以函数的方式调用//通过包装修饰器,把他包装在一个函数中function testDecorator (flag){function decorFn(constructor:any){constructor.prototype.getName=()=>{return '我是修饰的方法'}}}@testDecorator(true)class Preson {myFn(){}}const person =new Person();(preson as any).getName();function decorateClass(t:Function){ //类装饰器 本质是一个函数 不修改类的代码的前提下,可以给类增加成员//target 装饰的类t.prototype.school="bw"}@decorateClassclass Pereson<T>{ //泛型类id:Tname:stringconstructor(id:T,name:string){this.name=name;this.id=id}}var p=new Pereson<number>(11,"sss")console.log(p.school)
- vue ts 修饰器模式实现
如果ts中使用es6的东西,tsconfig中的“target”改成es6
建立能使用类型的地方,不要用any,any在你不知道类型的时候选择,放弃了约束
对象的约束要用interface而不是object
接口和类的结合使用
interface IGo{go(type:string):void}class Person//属性(private类的内部可以拿到)name :'zs'和方法(public 默认权限,都可以拿到)//protected 类和子类可以拿到 类的外部拿不到gettergetName():string{return this.name}settersetName(name:string){this.name=name;}//接口定义的是规范,方法定义的是实现interface |xxx{exam :(type:string):void //void可以没有返回值}class Xxx implements |Xxx{exam:(type:string):void{}}
