interview
typescript-frontend
TypeScript 类的 readonly 修饰符有什么作用

前端 TypeScript 面试题, TypeScript 类的 readonly 修饰符有什么作用?

前端 TypeScript 面试题, TypeScript 类的 readonly 修饰符有什么作用?

QA

Step 1

Q:: TypeScript 类的 readonly 修饰符有什么作用?

A:: TypeScript 中的 readonly 修饰符用于标记类中的属性为只读属性。一旦属性被设置为 readonly,它只能在初始化时赋值(例如在声明时或构造函数中),之后不能再被修改。这对于防止对象的状态被意外或错误地改变非常有用,从而提高代码的安全性和稳定性。

Step 2

Q:: 如何在 TypeScript 中使用 readonly 修饰符?

A:: 你可以在声明类的属性时使用 readonly 关键字。如下所示:

 
class Example {
  readonly name: string;
  constructor(name: string) {
    this.name = name;
  }
}
 

在这个例子中,name 属性在被初始化后不能被修改。

Step 3

Q:: readonly 和 const 的区别是什么?

A:: readonly 和 const 都用于限制对变量的修改,但它们的使用场景不同。const 用于声明常量变量,意味着变量本身的引用不能改变(但引用的对象内容可以改变)。readonly 则用于类的属性,意味着属性只能在初始化时被赋值,之后不能修改。

Step 4

Q:: readonly 修饰符能否与其他修饰符一起使用?

A:: 是的,readonly 修饰符可以与其他修饰符(如 public、private 和 protected)一起使用。例如:

 
class Example {
  public readonly id: number;
  private readonly name: string;
  constructor(id: number, name: string) {
    this.id = id;
    this.name = name;
  }
}
 

在这个例子中,id 是一个公共的只读属性,而 name 是一个私有的只读属性。

用途

readonly 修饰符的使用场景主要是在需要确保对象某些属性的不可变性时。例如,当你希望一个类的属性在初始化后不被修改,以防止数据被意外更改时,可以使用 readonly。特别是在大型代码库或多人协作的项目中,readonly 能够有效防止难以发现的错误和提升代码的健壮性。因此,这类面试题的目的是评估候选人是否了解如何在 TypeScript 中编写更加安全和稳定的代码。\n

相关问题

🦆
TypeScript 中接口与类型别名的区别是什么?

接口(interface)和类型别名(type alias)都是用于定义对象的结构,但接口主要用于描述对象的形状,而类型别名则更加灵活,除了对象类型外还可以表示其他类型(例如联合类型、元组等)。此外,接口可以被扩展或实现,而类型别名则不行。

🦆
TypeScript 中的 public,private 和 protected 修饰符有什么区别?

public 修饰符表示属性或方法是公开的,外部可以访问;private 修饰符表示属性或方法是私有的,只能在类的内部访问;protected 修饰符表示属性或方法是受保护的,只能在类的内部及其子类中访问。

🦆
TypeScript 中的抽象类和接口有什么区别?

抽象类(abstract class)是类的一种,它可以包含具体的实现方法以及抽象方法,不能直接实例化,只能被继承。而接口(interface)则完全是用来描述类的结构,不能包含任何具体实现。抽象类更像是类的模板,而接口则像是契约。

🦆
TypeScript 中的泛型是什么?如何使用?

泛型(Generics)是指在定义函数、接口或类时不预先指定具体的类型,而在使用时再指定具体的类型,从而使代码更加通用和灵活。比如:

 
function identity<T>(arg: T): T {
  return arg;
}
 

在这个例子中,identity 函数可以接受任何类型的参数,并返回相同类型的值。

🦆
TypeScript 中的装饰器Decorators是什么?

装饰器是一种特殊的声明,它能够被附加到类声明、方法、访问器、属性或参数上,用来修改这些元素的行为。装饰器通常用于元数据的添加、方法的修改、类的增强等。需要注意的是,装饰器目前是一个实验性的特性,在一些项目中需要启用 experimentalDecorators 编译选项。