interview
typescript-frontend
什么是 TypeScript 的接口怎么定义接口

前端 TypeScript 面试题, 什么是 TypeScript 的接口?怎么定义接口?

前端 TypeScript 面试题, 什么是 TypeScript 的接口?怎么定义接口?

QA

Step 1

Q:: 什么是 TypeScript 的接口?

A:: TypeScript 的接口是一种结构化的类型,用于定义对象的形状(shape),它描述了对象的属性以及它们的类型。接口不会在编译后生成实际的 JavaScript 代码,它只是一个静态类型检查的工具。接口可以用于类型检查、定义类的结构以及作为函数的参数类型。

Step 2

Q:: 如何定义一个 TypeScript 的接口?

A:: 你可以使用 interface 关键字来定义一个接口。例如,定义一个用户的接口如下:

 
interface User {
  id: number;
  name: string;
  email?: string; // 可选属性
}
 

在这个例子中,User 接口定义了一个具有 idname 和可选 email 属性的对象结构。

Step 3

Q:: 接口和类型别名有什么区别?

A:: 接口和类型别名都可以用于定义对象的形状,但它们有一些不同。接口主要用于对象、类和函数签名的描述,而类型别名(type alias)可以表示任何类型,包括基本类型、联合类型、元组等。接口可以被扩展(extend),而类型别名则不能直接扩展,但可以通过交叉类型来实现相似的功能。

Step 4

Q:: 如何在 TypeScript 中实现接口继承?

A:: 你可以使用 extends 关键字来实现接口继承。例如,继承一个基础接口:

 
interface Person {
  name: string;
  age: number;
}
 
interface Employee extends Person {
  employeeId: number;
}
 

在这个例子中,Employee 接口继承了 Person 接口,因此 Employee 包含了 nameage 属性,同时还有一个 employeeId 属性。

Step 5

Q:: 接口能否用于类的约束?如何实现?

A:: 接口可以用于约束类的结构。一个类可以实现(implement)一个或多个接口,确保类中定义了接口中规定的属性和方法。实现接口的示例如下:

 
interface Logger {
  log(message: string): void;
}
 
class ConsoleLogger implements Logger {
  log(message: string): void {
    console.log(message);
  }
}
 

在这个例子中,ConsoleLogger 类实现了 Logger 接口,因此必须实现 log 方法。

Step 6

Q:: 接口能否定义函数类型?如何定义?

A:: 接口可以用于定义函数类型。你可以在接口中指定函数的参数和返回值类型。示例如下:

 
interface SearchFunction {
  (source: string, subString: string): boolean;
}
 
const mySearch: SearchFunction = function(src, sub) {
  return src.includes(sub);
};
 

在这个例子中,SearchFunction 接口定义了一个函数类型,该函数接收两个 string 类型的参数,并返回一个 boolean 类型的值。

用途

面试 TypeScript 的接口相关问题,主要是为了评估候选人对类型系统的理解程度,尤其是他们在开发过程中如何利用接口来保证代码的可靠性和可维护性。在实际生产环境中,接口通常用于定义数据结构、约束类的实现、确保不同模块之间的契约(contract),并且在团队开发中,通过明确接口可以减少团队成员之间的沟通成本,避免因为数据结构或接口定义不一致而导致的错误。\n

相关问题

🦆
如何使用 TypeScript 的泛型与接口配合使用?

TypeScript 的泛型可以与接口结合使用,以创建更加灵活和可复用的接口。例如:

 
interface ApiResponse<T> {
  data: T;
  error?: string;
}
 
const response: ApiResponse<string> = {
  data: 'Success',
};
 

这个例子中,ApiResponse 接口通过泛型参数 T 来表示 data 属性的类型,使得接口可以适用于不同的数据类型。

🦆
TypeScript 中接口与抽象类的区别是什么?

接口和抽象类都可以用来定义对象的形状,但它们有显著的区别。接口仅用于定义结构,而抽象类可以包含实现代码(如方法的实现)。抽象类可以具有构造函数,而接口不能。接口支持多继承,而抽象类只能单继承。

🦆
如何在 TypeScript 中实现接口的合并?

TypeScript 中可以通过声明同名接口实现接口的合并。合并后的接口将包含所有接口声明中的属性。例如:

 
interface Box {
  height: number;
}
 
interface Box {
  width: number;
}
 
const box: Box = { height: 5, width: 10 };
 

在这个例子中,Box 接口会合并为一个包含 heightwidth 属性的接口。

🦆
在 TypeScript 中,如何使用接口定义可选属性和只读属性?

在接口中,可以使用 ? 来定义可选属性,使用 readonly 来定义只读属性。示例如下:

 
interface Car {
  readonly brand: string;
  model?: string;
}
 
const myCar: Car = { brand: 'Toyota' };
myCar.brand = 'Honda'; // 会导致错误,因为 brand 是只读属性。