编程前端开发工程师

类的类型和继承在 TypeScript 中是如何工作的?属性和方法声明的特点是什么,可能会出现什么问题,如何解决?

用 Hintsage AI 助手通过面试

答案。

背景

类的类型和继承被添加到 TypeScript 中,以支持面向对象的模式,这在其他语言中是常见的(Java, C#)。TypeScript 允许创建具有明确类型的属性和方法的类,并以类型安全的方式实现继承。

问题

在 JavaScript 中,没有明确的类型化,错误的属性使用不会在编译阶段被发现。问题发生在子类重写方法/属性时,违反基类约定和在处理 protected/private 时出错。

解决方案

TypeScript 允许使用关键字 public, private, protected,明确指定属性和方法的类型,使用 extends 继承类并实现接口。

代码示例:

class Animal { public name: string; protected age: number; private secret: string = "hidden"; constructor(name: string, age: number) { this.name = name; this.age = age; } speak(): void { console.log(`${this.name} makes a sound.`); } } class Dog extends Animal { constructor(name: string, age: number) { super(name, age); } speak(): void { console.log(`${this.name} barks.`); } } const dog = new Dog("Rex", 4); dog.speak(); // Rex barks.

关键特点:

  • 类的属性和方法的明确类型声明
  • 使用访问修饰符进行封装
  • 支持继承和方法重写的类型控制

诱导性问题。

如果不指定类属性的类型会怎样?

TypeScript 将尝试根据赋值推断类型,如果没有赋值则类型为 any,这降低了代码的安全性。

class Test { value; constructor(v: number) { this.value = v; } }

如果没有指定默认值,value 将为 any 类型——这可能会导致类型安全的漏洞。

可以修改继承方法的访问修饰符吗?

可以,但只能增强它(例如,从 public 改为 protected 或 private 不可以),而从 private 改为 public 不可以,因为 private 成员不被继承。这将导致编译错误。

在 TypeScript 中可以继承多个类吗?

不可以,类的多重继承是禁止的。可以实现多个接口,但只能从一个类 extends。

类型错误和反模式

  • 不指定属性的类型导致隐式 any
  • 错误的重写方法(签名不匹配)
  • 违反封装(公开私有属性)

生活实例

消极案例

在项目中,所有类都没有使用访问修饰符和明确类型,以加快开发速度。

优点:

  • 快速原型设计

缺点:

  • 难以追踪访问错误
  • 由于意外重写属性而频繁出现 bug

积极案例

所有类的成员都有严格类型,被使用 private/protected/public,属性和方法严格类型化。

优点:

  • 防止编译阶段的错误
  • 明确的架构,易于理解对象结构

缺点:

  • 设计所需的时间更长,实验任务的灵活性下降