什么是类型接口?
下文默认基于 TypeScript 5.x,并假设开启
strict: true。
面试速答(30 秒版 TL;DR)
- 类型接口通常就是指 TypeScript 里的
interface。 - 它的作用是:在编译阶段描述一个对象、函数、类实例应该满足什么结构。
- 重点不是“有个接口关键字”,而是它体现了 TypeScript 的核心思想:
- 按结构检查;
- 用契约约束协作;
- 让实现和使用方在编译期对齐。
interface只存在于类型系统里,运行到 JavaScript 后不会保留。
1. 最简单的理解:给“形状”立规矩
interface User {
id: number;
name: string;
age?: number;
}
const user: User = {
id: 1,
name: "Tom",
};
这段代码的含义不是“创建了一个运行时对象模板”,而是:
- 任何被当成
User使用的值; - 至少要满足
id和name这套结构约束。
2. 为什么叫“接口”
因为它表达的是:
- 外部能看到什么;
- 调用方能依赖什么;
- 实现方必须提供什么。
也就是常说的“契约”。
比如团队协作时:
- 后端约定返回字段;
- 组件约定 props 结构;
- 类约定必须实现哪些方法;
都很适合用接口表达。
3. 接口最常见的几种写法
3.1 描述对象结构
interface Product {
id: string;
title: string;
price: number;
tags?: string[];
}
3.2 描述函数签名
interface Formatter {
(value: number): string;
}
const formatPrice: Formatter = (value) => `¥${value}`;
3.3 描述类实例应具备的能力
interface Logger {
log(message: string): void;
}
class ConsoleLogger implements Logger {
log(message: string) {
console.log(message);
}
}
4. 接口为什么适合面试里的“对象建模题”
因为它很贴近业务语言。
例如:
interface PageResult<T> {
list: T[];
total: number;
page: number;
pageSize: number;
}
这类写法传达的信息很清楚:
- 这是一个分页结果;
T决定列表项类型;- 其他字段是固定契约。
也就是说,接口在工程里最大的价值不是“语法”,而是把领域模型表达清楚。
5. 接口有哪些常见能力
5.1 可选属性
interface Config {
baseURL: string;
timeout?: number;
}
5.2 只读属性
interface Point {
readonly x: number;
readonly y: number;
}
5.3 索引签名
interface StringMap {
[key: string]: string;
}
5.4 继承接口
interface Animal {
name: string;
}
interface Dog extends Animal {
bark(): void;
}
5.5 声明合并
interface AppConfig {
apiBase: string;
}
interface AppConfig {
retry?: number;
}
这在第三方库补充声明里很常见。
6. 接口的本质是结构类型,不是名义类型
TypeScript 默认是结构化类型系统(structural typing)。
interface User {
name: string;
}
const person = { name: "Jerry", age: 20 };
const user: User = person;
之所以允许,是因为:
person至少满足User需要的结构;- TypeScript 关心“长得像不像”,不是“你是不是显式声明成这个接口”。
7. 高频面试题标准答法
7.1 接口和类有什么区别
- 接口只描述结构,不提供实现;
- 类既有类型信息,也有运行时实现。
7.2 接口在运行时存在吗
不存在。
编译成 JavaScript 后,接口会被完全擦除。
7.3 接口能不能描述函数
能,不只可以描述对象,还可以描述:
- 函数签名;
- 构造函数签名;
- 类实例结构。
8. 常见误区
- 误区 1:以为接口只能给对象用。
- 实际上函数、类实例都能描述。
- 误区 2:以为接口会生成运行时代码。
- 不会,它只参与编译期检查。
- 误区 3:把接口当成“后端 Java/C# 那种运行时接口”。
- TypeScript 的接口本质是类型系统契约。
速记要点
- 类型接口就是用
interface描述结构契约。 - 常用于对象模型、函数签名、类实现约束。
- 它只存在编译期,不存在运行时。