TS(type,属性修饰符,抽象类,interface)一次性全部总结

[复制链接]
发表于 2026-1-15 01:20:49 | 显示全部楼层 |阅读模式
目次
1.type
1.根本用法
2.团结范例
3.交错范例
2.属性修饰符
1.public  属性修饰符
属性的简写情势
2.proteced  属性修饰符
3.private   属性修饰符
4.readonly  属性修饰符
3.抽象类
4.interface
1.界说类布局
2.界说对象布局
3.界说函数布局
4.接口之间的继承
5.接口自动归并
5. interface和type的区别
6. interface与抽象类的区别


1.type

   type  可以为恣意范例创建别名,让代码更轻便,可读性更强,同时能更方便的举行范例复用和扩展。
  1.根本用法

  1. type num = number;
  2. let price: num
  3. price = 100
复制代码
2.团结范例

  1. type Status = number | string
  2. type Gender = '男' | '⼥'
  3. function printStatus(status: Status) {
  4.   console.log(status)
  5. }
  6. function logGender(str: Gender) {
  7.   console.log(str)
  8. }
  9. printStatus(404)
  10. printStatus('200')
  11. printStatus('501')
  12. logGender('男')
  13. logGender('⼥')
复制代码
3.交错范例

  1. //⾯积
  2. type Area = {
  3.   height: number //⾼
  4.   width: number //宽
  5. }
  6. //地址
  7. type Address = {
  8.   num: number //楼号
  9.   cell: number //单元号
  10.   room: string //房间号
  11. }
  12. // 定义类型House,且House是Area和Address组成的交叉类型
  13. type House = Area & Address
  14. const house: House = {
  15.   height: 180,
  16.   width: 75,
  17.   num: 6,
  18.   cell: 3,
  19.   room: '702'
  20. }
复制代码
2.属性修饰符


1.public  属性修饰符

  1. class Person {
  2.   // name写了public修饰符,age没写修饰符,最终都是public修饰符
  3.   public name: string
  4.   age: number
  5.   constructor(name: string, age: number) {
  6.     this.name = name
  7.     this.age = age
  8.   }
  9.   speak() {
  10.     // 类的【内部】可以访问public修饰的name和age
  11.     console.log(`我叫:${this.name},今年${this.age}岁`)
  12.   }
  13. }
  14. const p1 = new Person('张三', 18)
  15. // 类的【外部】可以访问public修饰的属性
  16. console.log(p1.name)
复制代码
  1. class Student extends Person {
  2.   constructor(name: string, age: number) {
  3.     super(name, age)
  4.   }
  5.   study() {
  6.     // 【⼦类中】可以访问⽗类中public修饰的:name属性、age属性
  7.     console.log(`${this.age}岁的${this.name}正在努⼒学习`)
  8.   }
  9. }
复制代码
属性的简写情势

  1. class Person {
  2.   constructor(
  3.     public name: string,
  4.     public age: number
  5.   ) {}
  6. }
复制代码
2.proteced  属性修饰符

  1. class Person {
  2.   // name和age是受保护属性,不能在类外部访问,但可以在【类】与【⼦类】中访问
  3.   constructor(
  4.     protected name: string,
  5.     protected age: number
  6.   ) {}
  7.   // getDetails是受保护⽅法,不能在类外部访问,但可以在【类】与【⼦类】中访问
  8.   protected getDetails(): string {
  9.     // 类中能访问受保护的name和age属性
  10.     return `我叫:${this.name},年龄是:${this.age}`
  11.   }
  12.   // introduce是公开⽅法,类、⼦类、类外部都能使⽤
  13.   introduce() {
  14.     // 类中能访问受保护的getDetails⽅法
  15.     console.log(this.getDetails())
  16.   }
  17. }
  18. const p1 = new Person('杨超越', 18)
  19. // 可以在类外部访问introduce
  20. p1.introduce()
  21. // 以下代码均报错
  22. // p1.getDetails()
  23. // p1.name
  24. // p1.age
复制代码
  1. class Student extends Person {
  2.   constructor(name: string, age: number) {
  3.     super(name, age)
  4.   }
  5.   study() {
  6.     // ⼦类中可以访问introduce
  7.     this.introduce()
  8.     // ⼦类中可以访问name
  9.     console.log(`${this.name}正在努⼒学习`)
  10.   }
  11. }
  12. const s1 = new Student('tom', 17)
  13. s1.introduce()
复制代码
3.private   属性修饰符

  1. class Person {
  2.   constructor(
  3.     public name: string,
  4.     public age: number,
  5.     // IDCard属性为私有的(private)属性,只能在【类内部】使⽤
  6.     private IDCard: string
  7.   ) {}
  8.   private getPrivateInfo() {
  9.     // 类内部可以访问私有的(private)属性 —— IDCard
  10.     return `身份证号码为:${this.IDCard}`
  11.   }
  12.   getInfo() {
  13.     // 类内部可以访问受保护的(protected)属性 —— name和age
  14.     return `我叫: ${this.name}, 今年刚满${this.age}岁`
  15.   }
  16.   getFullInfo() {
  17.     // 类内部可以访问公开的getInfo⽅法,也可以访问私有的getPrivateInfo⽅法
  18.     return this.getInfo() + ',' + this.getPrivateInfo()
  19.   }
  20. }
  21. const p1 = new Person('张三', 18, '110114198702034432')
  22. console.log(p1.getFullInfo())
  23. console.log(p1.getInfo())
  24. // 以下代码均报错
  25. // p1.name
  26. // p1.age
  27. // p1.IDCard
  28. // p1.getPrivateInfo()
复制代码
4.readonly  属性修饰符

  1. class Car {
  2.   constructor(
  3.     public readonly vin: string, //⻋辆识别码,为只读属性
  4.     public readonly year: number, //出⼚年份,为只读属性
  5.     public color: string,
  6.     public sound: string
  7.   ) {}
  8.   // 打印⻋辆信息
  9.   displayInfo() {
  10.     console.log(`
  11.     识别码:${this.vin},
  12.     出⼚年份:${this.year},
  13.     颜⾊:${this.color},
  14.     ⾳响:${this.sound}
  15.     `)
  16.   }
  17. }
  18. const car = new Car('1HGCM82633A123456', 2018, '⿊⾊', 'Bose⾳响')
  19. car.displayInfo()
  20. // 以下代码均错误:不能修改 readonly 属性
  21. // car.vin = '897WYE87HA8SGDD8SDGHF';
  22. // car.year = 2020;
复制代码
3.抽象类

   简记:抽象类不能被实例化,其意义是可以被继承,抽象类里可以有平凡方法,也可以有抽象方法。
  通过以了局景,明白抽象类:
   我们界说一个抽象类Package,表现全部包裹的根本布局,任何包裹都有重量属性weight,包裹须要盘算费用。但差别范例的包裹(如:标准速率,特快专递)都有差别的盘算方式,因此用于盘算费用的calculate方法是一个抽象方法,必须由详细的子类来实现。 
  1. abstract class Package {
  2.   constructor(public weight: number) {}
  3.   // 抽象⽅法:⽤来计算运费,不同类型包裹有不同的计算⽅式
  4.   abstract calculate(): number
  5.   // 通⽤⽅法:打印包裹详情
  6.   printPackage() {
  7.     console.log(`包裹重量为: ${this.weight}kg,运费为: ${this.calculate()}元`)
  8.   }
  9. }
复制代码
  1. // 标准包裹
  2. class StandardPackage extends Package {
  3.   constructor(
  4.     weight: number,
  5.     public unitPrice: number // 每公⽄的固定费率
  6.   ) {
  7.     super(weight)
  8.   }
  9.   // 实现抽象⽅法:计算运费
  10.   calculate(): number {
  11.     return this.weight * this.unitPrice
  12.   }
  13. }
  14. // 创建标准包裹实例
  15. const s1 = new StandardPackage(10, 5)
  16. s1.printPackage()
复制代码
  1. class ExpressPackage extends Package {
  2.   constructor(
  3.     weight: number,
  4.     private unitPrice: number, // 每公⽄的固定费率(快速包裹更⾼)
  5.     private additional: number // 超出10kg以后的附加费
  6.   ) {
  7.     super(weight)
  8.   }
  9.   // 实现抽象⽅法:计算运费
  10.   calculate(): number {
  11.     if (this.weight > 10) {
  12.       // 超出10kg的部分,每公⽄多收additional对应的价格
  13.       return 10 * this.unitPrice + (this.weight - 10) * this.additional
  14.     } else {
  15.       return this.weight * this.unitPrice
  16.     }
  17.   }
  18. }
  19. // 创建特快包裹实例
  20. const e1 = new ExpressPackage(13, 8, 2)
  21. e1.printPackage()
复制代码
像是如许的情势我自己有自己的明白情势:
        好比如我们走路,出发点都是一样的,止境也是一样的,唯独我们的过程是不一样的,有的骑车,有的走路等等,但是这多种方式我们就可以写成继承的方式,那么我们统共耗费的时间就可以写在这个抽象类内里。 
4.interface

1.界说类布局

   interface是一种界说布局的方式,重要作用是为:类,对象,函数等规定一种左券,如允许以确保代码的同等性和范例安全,但要留意interface只能界说格式,不能包罗任何实现!
  1. // PersonInterface接⼝,⽤与限制Person类的格式
  2. interface PersonInterface {
  3.   name: string
  4.   age: number
  5.   speak(n: number): void
  6. }
  7. // 定义⼀个类 Person,实现 PersonInterface 接⼝
  8. class Person implements PersonInterface {
  9.   constructor(
  10.     public name: string,
  11.     public age: number
  12.   ) {}
  13.   // 实现接⼝中的 speak ⽅法
  14.   speak(n: number): void {
  15.     for (let i = 0; i < n; i++) {
  16.       // 打印出包含名字和年龄的问候语句
  17.       console.log(`你好,我叫${this.name},我的年龄是${this.age}`)
  18.     }
  19.   }
  20. }
  21. // 创建⼀个 Person 类的实例 p1,传⼊名字 'tom' 和年龄 18
  22. const p1 = new Person('tom', 18)
  23. p1.speak(3)
复制代码
2.界说对象布局

  1. interface UserInterface {
  2.   name: string
  3.   readonly gender: string // 只读属性
  4.   age?: number // 可选属性
  5.   run: (n: number) => void
  6. }
  7. const user: UserInterface = {
  8.   name: '张三',
  9.   gender: '男',
  10.   age: 18,
  11.   run(n) {
  12.     console.log(`奔跑了${n}⽶`)
  13.   }
  14. }
复制代码
3.界说函数布局

  1. interface CountInterface {
  2.   (a: number, b: number): number
  3. }
  4. const count: CountInterface = (x, y) => {
  5.   return x + y
  6. }
复制代码
4.接口之间的继承

  1. interface PersonInterface {
  2.   name: string // 姓名
  3.   age: number // 年龄
  4. }
  5. interface StudentInterface extends PersonInterface {
  6.   grade: string // 年级
  7. }
  8. const stu: StudentInterface = {
  9.   name: '张三',
  10.   age: 25,
  11.   grade: '⾼三'
  12. }
复制代码
5.接口自动归并

  1. // PersonInterface接⼝
  2. interface PersonInterface {
  3.   // 属性声明
  4.   name: string
  5.   age: number
  6. }
  7. // 给PersonInterface接⼝添加新属性
  8. interface PersonInterface {
  9.   // ⽅法声明
  10.   speak(): void
  11. }
  12. // Person类实现PersonInterface
  13. class Person implements PersonInterface {
  14.   name: string
  15.   age: number
  16.   // 构造器
  17.   constructor(name: string, age: number) {
  18.     this.name = name
  19.     this.age = age
  20.   }
  21.   // ⽅法
  22.   speak() {
  23.     console.log('你好!我是⽼师:', this.name)
  24.   }
  25. }
复制代码

5. interface和type的区别



  • 雷同点:interface和type都可以界说对象布局,在界说对象布局时两者可以互换。
  • 差别点:   

    • interface:更专注于界说对象和类的布局,支持继承,归并。
    • type:可以界说范例别名,团结范例,交错范例,但不支持继承和自动归并。

6. interface与抽象类的区别



  • 雷同点:都能界说一个类的格式(界说类应遵照的左券)
  • 差别点:   

    • 接口:只能形貌布局,不能有任何代码实现,一个类可以实现多个接口
    • 抽象类:既可以包罗抽象方法,也可以包罗详细方法,一个类只能继承一个抽象类






免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表