TypeScript 中 interface 和 type 的区别

在 TypeScript 中,interfacetype 都用于定义类型,但它们有一些关键区别。今天我们就来详细对比它们的特性、使用场景和注意事项,帮你彻底掌握这两个核心概念!


核心区别对比表

特性 interface type
扩展性 支持 extendsimplements 支持交叉类型(&
合并声明 同名接口会自动合并 同名类型会报错
适用场景 定义对象形状、类实现 复杂类型(联合、元组、条件类型等)
兼容性 更适合面向对象编程 更灵活,适合函数式编程
示例 interface User { name: string } type User = { name: string }

详细解析

1. 扩展与继承

interface :通过 extends 扩展其他接口。

typescript 复制代码
interface Person {
  name: string;
}
interface User extends Person {
  id: number;
}

type :通过交叉类型(&)扩展。

ini 复制代码
type Person = {
  name: string;
};
type User = Person & { id: number };

2. 合并声明

interface:同名接口会自动合并。

kotlin 复制代码
interface User { name: string; }
interface User { age: number; }
// 最终 User 包含 name 和 age

type:同名类型会报错。

ini 复制代码
type User = { name: string; };
type User = { age: number; }; // 报错:重复声明

3. 适用场景

interface 更适合

  • 定义对象的形状(如 API 响应)。

类的实现(implements)。

typescript 复制代码
interface Animal {
  eat(): void;
}
class Dog implements Animal {
  eat() { console.log("Eating..."); }
}

type 更适合

定义联合类型、元组、条件类型等复杂类型。

typescript 复制代码
// 联合类型
type Status = "success" | "error";
// 元组
type Point = [number, number];
// 条件类型
type IsString<T> = T extends string ? true : false;

4. 其他区别

type 可以定义原始类型

typescript 复制代码
type ID = number | string

interface 可以声明类实例的类型

typescript 复制代码
interface ClockInterface {
  currentTime: Date;
}
class Clock implements ClockInterface {
  currentTime: Date = new Date();
}

如何选择?

  • 默认情况下 :优先使用 interface(更适合面向对象编程)。
  • 需要复杂类型时 :使用 type(如联合类型、条件类型)。
  • 需要合并声明时 :使用 interface

总结

场景 推荐使用 示例
定义对象形状 interface interface User { name: string }
类实现 interface class X implements Y {}
联合类型/复杂类型 type `type ID = string number`
需要合并声明 interface 同名接口自动合并
相关推荐
Hyyy33 分钟前
普通前端续命周报——第2周
前端
swipe38 分钟前
DeepAgents 实战:用多 Agent 架构搭一个深度调研助手
javascript·面试·llm
wuxinyan1231 小时前
工业级大模型学习之路030:Streamlit 企业级智能体前端工作台
前端·学习·streamlit·智能体
修己xj1 小时前
告别无效刷屏!TrendRadar:最快30秒部署的开源热点助手,让你只看真正关心的新闻
前端
雪宫街道1 小时前
synchronized 锁的范围:对象锁、类锁与代码块锁
java·jvm·后端·面试
anOnion2 小时前
构建无障碍组件之Slider Pattern
前端·html·交互设计
云水一下2 小时前
JavaScript 从零基础到精通系列:前世今生与编程启蒙
前端·javascript
月亮邮递员6162 小时前
Markdown语法总结
开发语言·前端·javascript
Kurisu5752 小时前
雾锁王国修改器下载2026最新
前端·修改器代码
Rain5093 小时前
mini-cc 的 MCP 协议:给 AI 装个 USB-C 接口
c语言·开发语言·前端·人工智能·架构·node.js·ai编程