TS中Class类的继承

我们有下面一个代码,其中创建了一个Dog类和Cat类,这两个类中都有姓名和年龄属性和bark方法

class Dog {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  bark() {
    console.log(this.name + "汪汪汪");
  }
}

class Cat{
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  bark() {
    console.log(this.name + "喵喵喵");
  }
}

let dog = new Dog("旺财", 5);
let cat = new Cat("咪咪", 3);
dog.bark();  // 打印:旺财汪汪汪
cat.bark();  // 打印:咪咪喵喵喵

但是我们把一个代码写了两次,冗余度增加。

一、使用extends关键字继承父类

我们可以将上面两个类的公共特征提取出来组成一个新的Animal类。

然后在创建Dog类和Cat类的时候继承Animal类即可。

子类继承父类的语法格式如下:

class 子类 extends 父类 {   }

class Animal {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  bark() {
    console.log(this.name + "在叫");
  }
}

class Dog extends Animal {}

class Cat extends Animal {}

let dog = new Dog("旺财", 5);
let cat = new Cat("咪咪", 3);
dog.bark(); // 打印:旺财在叫
cat.bark(); // 打印:咪咪在叫

通过继承类可以将多个类中共有的代码写在一个父类中,这样只需要写一次即可让所有的子类拥有父类的属性和方法。

二、子类中属性和方法的添加

如果希望在子类中添加一些父类没有的属性和方法,直接在子类中添加即可。

三、子类中方法的重写

如果子类中添加了和父类相同的方法,子类的方法会覆盖掉父类的方法。

这种子类覆盖掉父类的方法的形式,我们称之为重写。

### TypeScript (TS) 的 `class` 概念 TypeScriptJavaScript 的超集,它扩展了 JavaScript 来提供更好的型安全性和结构化支持。在 TypeScript 和 ES6 引入的 `class` 关键字用于创建(即面向对象程序设计的基础),这允许更清晰地组织代码并提供更强大的特性。 #### **什么是 (`class`)** 定义了一种型的实例(对象)的行为和属性。通过使用 `class` 关键字,您可以声明一个新的,该可以包含构造函数、静态方法、成员变量和方法。 #### **构造函数** 构造函数是的特殊方法,当创建的新实例时自动调用。它们通常用于初始化实例的状态: ```typescript class MyClass { constructor(private myAttribute: any) { // 初始化操作 } } ``` 在这个例子,`MyClass` 有一个私有属性 `myAttribute`,其在构造函数设置。 #### **继承** 也可以从其他派生(继承),这使得子类可以重用父的功能,并且能够定义自己的行为: ```typescript class ParentClass { public method() { // 方法实现 } } class ChildClass extends ParentClass { override method() { // 覆盖父方法实现 } } ``` 这里,`ChildClass` 继承自 `ParentClass` 并重写了其方法。 #### **接口和型约束** 在 TypeScript ,还可以使用接口来描述对象的形状(包括属性和方法)。结合 `extends` 关键字,可以通过实现接口来明确指定它的行为和结构: ```typescript interface MyInterface { name: string; greet(): void; } class MyClass implements MyInterface { constructor(public name: string) {} greet() { console.log(`Hello, ${this.name}!`); } } ``` 在这个例子,`MyClass` 实现了一个名为 `MyInterface` 的接口。 ### **使用 `type` 进行约束** 在您的引用示例展示了如何使用 `type` 进行泛型型约束。这允许创建更具灵活性的函数,可以根据传递给它们的具体型执行不同的逻辑: ```typescript type Class = string; function result<T extends Class>(val: T): T { console.log(val.length); return val; } result<string>("zhangsan"); ``` 这个 `result` 函数接受一个参数,假设它是某种型(这里通过 `T extends Class` 进行约束),并返回相同的值。型断言 (`<string>`) 表明调用者知道传递的是字符串型。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值