类的类型和继承被添加到 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。
在项目中,所有类都没有使用访问修饰符和明确类型,以加快开发速度。
优点:
缺点:
所有类的成员都有严格类型,被使用 private/protected/public,属性和方法严格类型化。
优点:
缺点: