ts和js有什么区别

66 阅读3分钟

1.let变量:类型/let变量:类型=值 function fn(参数:类型,参数:类型):类型{ } 2.若let变量=值,则自动判定类型 3.若一个变量给另一个变量赋值,被赋值变量无法识别其变量类型,用类型断言:变量后面加 as 类型或者变量前面加<类型> 4.如果没有写类型,默认是any 5.let b:{name:string,age?:numvber}?表示可以没有age 5.1.对象里面加,[xx:string]:any表示后面可以加无限个键值变量 (1.let e:unknown不确定类型能用unknown就用unlknown,能不用any就不用nay 6.let d:(a:number,b:number)=>number 7.let a:string[];数组里都是什么类型或者let g:Array<number/any> 8.元组:固定长度的数组let h:[string,string] 9.枚举:enum dj{ male=0, Famale=1} let i:{name:string,dc:dj}; i={name:‘熟悉熟悉’, dc:js.male(会自动转化为0)} console.log(i.dc===js.male) 10.let j:string|number let j:{name:string}&{age:number} j={name:‘孙悟空’,age:18} 10.别名type myType=1|2|3 let k:myType 2.void没有返回值,return null也是 3.never:不会返回结果:报错代码立即结束throw new Error(‘报错了!’))

1.static类中不用创建对象就能访问的属性,就不能通过实例去访问了,写在(class里名称的前面)console.log(Person.age) 实例属性可以随意改per.name='s' readonly表示只能读 不能改 可以和static一起用 2.方法的static和1.一致 3.class里面用constructor构造函数,实例创建时调用,constructor里面this表示当前的实例 const dog=new Dog(‘小黑’,2) class Dog{ name:string; age:number; constructor(name:string,age:number){ this.name=name; this.age=age; } bark(){ console.log(this)在方法中可以通过this表示当前调用方法的对象 }}

继承 class Dog extends Animal{ //增加一个run方法: run(){ cons... }

} 子类的方法会覆盖父类的方法(名称一样时) super相当于父类(子类想引用父类的实例) 子类不能直接constructor,必须在里面写super(xx)(要用const..的话,必须在里面继承一下父类) 例子:constructor(name:string//父类属性,这里必须传进去,age:number){ super(name//这个是父类里面的属性,所有必须从子类super里面传进去); this.age=age } 抽象类 如果不想让父类被创建实例,在父类前面加abstract abstract class Animal{} 在抽象类里面的方法前面加一个abstract,表示方法必须由子类来定义 不能加方法体 abstract sayHelloo():void; 在子类中直接写一下这个方法 接口: type myType={ name:string, age:number};//可以这样写,也可以用接口写 const obj:myType={ name:‘sss’, age:111 } 接口:interface myInterface{ name:string; age:nimber } const obj:myType={ name:‘sss’, age:111 }//使用完全一致 区别是接口可以重复申明(合并) 接口中所有的属性都不能有实际值 接口中所有方法都是抽象方法 sayHello():void 定义类时可以用类实现一个接口 class Myclass implements myInter{ 把里面属性都得重复定义一遍,要用constructor } (接口里面都是抽象属性,定义标准) 属性的封装:在类里面属性前添加private只能在类中访问,实例中不能修改(通过类中添加方法使其暴露出来,外部访问) 类中加方法getname(){ return this.name; } setName(value:string){ this.name=value }属性的控制器掌握在我们手中 ts设置了get方法 get name() {return this.name}//使用per(实例).name(找的name方法) public默认值

protect受保护的属性 只能在当前类和当前子类中使用,不能在任何实例中访问 (加:可以把变量直接写在constructor中: constructor(public name:string,public age:number(什么this=什么都不用写了),直接实例化赋值就行))S 泛型:类型不明确时any function fn(a:T):T{} function fn<a:T>:T{ return a;} 使用fn(10); 2.fn{ 'hello'}

可以指定两个泛型 function fn2<T,k>(a:T,B:K):T{ return a;}

泛型加接口: interface Inter{ length:number;} function fn3(a:T):number{ return a.length } 类中用泛型 class MyClass{ name:T; constructor(name:T){ this.name=name; } const mc=new MyClass('孙悟空')

image.png

image.png

image.png

image.png

image.png

image.png