文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

typescript中的class和interface

2024-12-24 15:07

关注

 typescript这个东西说实在的,真的是容易忘记,一段时间不用就感觉特别陌生,但是回过头来看看,又有一种熟悉的感觉,有句话这么说的ts越用越香,它确实能够规范我们的书写的格式,语法校验和类型校验等。之前写过react+ts的一个demo,但是时间久了就忘记了,现在也是趁着热度再回顾一下ts的内容,以及一些高阶语法,现在我们回顾一下ts中常见的类和接口,如果喜欢的可以点赞,评论,关注公众号让更多的人看到。如果有问题也可以评论留言,我们一起相互学习,一起进步。

class
首页我们要清楚的一点是typescript中类和javascript中ES6语法类的区别,千万不要混淆。ts中相比于js添加了声明属性的类型和参数的类型以及返回结果类型。这个地方一看就会一写就不对,如果不声明ts会报错。

  1. class Person{ 
  2.     name:string; 
  3.     constructor(name:string){ 
  4.         this.name = name
  5.     } 
  6.     getName():void{ 
  7.         console.log(this.name); 
  8.     } 

  1. class Person{ 
  2.     constructor(name){ 
  3.         this.name = name
  4.     } 
  5.     getName(){ 
  6.         console.log(this.name); 
  7.     } 

ES5编辑后的结果

  1. var Person =  (function () { 
  2.     function Person(name) { 
  3.         this.name = name
  4.     } 
  5.     Person.prototype.getName = function () { 
  6.         console.log(this.name); 
  7.     }; 
  8.     return Person; 
  9. }()); 

类的get和set
ts在编译get和set的时候默认是es3编译,vscode编辑器会报错error TS1056: Accessors are only available when targeting ECMAScript 5 and higher需要编译到版本ES5或以上,解决办法:$ tsc xxx.ts -t es5。

  1. class User
  2.     myname:string; 
  3.     constructor(myname:string){ 
  4.         this.myname = myname 
  5.     } 
  6.     get name(){ 
  7.         return this.myname 
  8.     } 
  9.     set name(newName:string){ 
  10.         this.myname = newName 
  11.     } 

ES5编译后的结果

  1. var User =  (function () { 
  2.     function User(myname) { 
  3.         this.myname = myname; 
  4.     } 
  5.     Object.defineProperty(User.prototype, "name", { 
  6.         get: function () { 
  7.             return this.myname; 
  8.         }, 
  9.         setfunction (newName) { 
  10.             this.myname = newName; 
  11.         }, 
  12.         enumerable: false
  13.         configurable: true 
  14.     }); 
  15.     return User
  16. }()); 

这里有几个思考问题,答案见文末:

  1. var u = new User("a"); 
  2. console.log(u); 
  3. console.log(u.myname); 
  4. u.myname = 'b'
  5. console.log(u.myname); 
  6. console.log(u.hasOwnProperty("name")); 
  7. console.log(Object.getPrototypeOf(u)); 
  8. console.log(Object.getPrototypeOf(u).hasOwnProperty("name")); 

抽象类
abstract关键字表示抽象类,抽象类是不能被实例化即new,只能被继承,抽象类一般是用来封装一些公共的,提供给子类使用的方法和属性的

  1. abstract class Animal{ 
  2.     public readonly name:string; 
  3.     protected age:number = 38; 
  4.     private money:number = 10; 
  5.     constructor(name:string){ 
  6.         this.name = name 
  7.     } 
  8. class Dog extends Animal{ 
  9.     static className = 'Dog' 
  10.     static getClassName(){ 
  11.         console.log(this.className) 
  12.     } 
  13.     getName(){ 
  14.         console.log(this.name
  15.     } 
  16.     getAge(){ 
  17.         console.log(this.age) 
  18.     } 
  19. let a = new Animal("ss"); 

这里打印看一下继承的结果:

  1. console.log(a); //Dog { age: 38, money: 10, name'ss' } 

这里顺便说一下访问修饰符 public protected private

public 里里外外都能访问,包括自己、自己的子类、其他类都能
protected 自己和子类能访问但是其他地方不能访问
private 私有的(只有自己能访问,子类的其他都不能访问)

接口表示对象的属性

  1. interface Rectangle { 
  2.     width: number; 
  3.     height: number 
  4.  
  5. let r: Rectangle = { 
  6.     width: 100, height: 10 
  7.  
  8. interface Speakable { 
  9.     speak(): void; 
  10.     name?: string 
  11.  
  12. let speaker: Speakable = { 
  13.     //name:"bdt"
  14.     speak() { } 

接口用来描述抽象的行为

  1. interface AnimalLink { 
  2.     eat(): void; 
  3.     move(): void 

接口可以实现继承

  1. interface PersonLike extends AnimalLink { 
  2.     speak(): void 
  3. class Person2 implements PersonLike { 
  4.     speak() { }; 
  5.     eat() { }; 
  6.     move() { } 

通过接口约束变量类型

  1. interface Person3 { 
  2.     readonly id: number; 
  3.     name: string; 
  4.     [PropName: string]: any 
  5. let p1: Person3 = { 
  6.     id: 1, 
  7.     name"sss" 

通过接口约束(规范)函数

  1. interface DiscountInterface{ 
  2.     (price:number):number 
  3. let discount:DiscountInterface = function (price: number): number { 
  4.     return price * .8 

通过索引约束数组和对象

  1. interface UserInterface{ 
  2.     [index:number]:string 
  3.  
  4. let arr:UserInterface = ['aa','bb'
  5.  
  6. interface UserInterface2{ 
  7.     [index:string]:string 
  8. let obj:UserInterface2  = {name:"sss"

通过接口约束构造函数

  1. class Animal3{ 
  2.     constructor(public name:string){} 
  3. interface WithClassName{ 
  4.     new (name:string):Animal3 
  5. function createClass(clazz:WithClassName,name:string){ 
  6.     return new clazz(name
  7. let a3 = createClass(Animal3,"别抖腿"); 
  8. console.log(a3) 

class和interface的区别
class 类声明并实现方法
interface 接口声明,但是不能实现方法

  1. abstract class Animal{ 
  2.     name:string="111"
  3.     abstract speak():void;  //抽象类和方法不包含具体实现  必须在子类中实现 
  4. //接口里的方法都是抽象的 
  5. interface Flying{ 
  6.     fly():void 
  7. interface Eating{ 
  8.     eat():void 
  9. class Dog extends Animal{ 
  10.     speak(){ 
  11.         console.log("汪汪汪")   //重写:子类重写继承自父类中的方法 
  12.     } 
  13. class Cat extends Animal implements Flying,Eating{ 
  14.     speak(){   //继承抽象类的方法必须实现 
  15.         console.log("喵喵喵"
  16.     } 
  17.     fly(){ 
  18.         console.log("我是一只飞货"
  19.     } 
  20.     eat(){ 
  21.         console.log("我是一只吃货"
  22.     } 

写在最后
文中答案

  1. User { myname: 'a' } 
  2. false 
  3. User { name: [Getter/Setter] } 
  4. true 

 

 

来源:小丑的小屋内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯