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 同名接口自动合并
相关推荐
吴声子夜歌18 分钟前
Java面试——数据结构(二)
java·数据结构·面试
zzzzzz3101 小时前
别急着把动效组件搬进页面:从 react-bits 看 React 动效库该怎么评估
前端·react.js·开源
李姆斯9 小时前
为啥Agent在coding表现这么好,但是在别的领域就是差的不少?
前端·agent·ai编程
Rain的Java大神之路11 小时前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
鱼与宇11 小时前
前端Web(html+css+js+vue3)
前端
雪芽蓝域zzs13 小时前
(六)打包优化 + Nginx 部署完整配置 + 项目收尾
前端·vue.js
研☆香13 小时前
聊一聊前端的常见字 关键字
开发语言·前端·javascript
东风破_13 小时前
JWT 1:从一个登录请求开始,理解 React 项目里的 API 层与 Mock
前端·后端
东风破_13 小时前
JWT 3:为什么 Token 要放进 Authorization?Axios 拦截器到底解决了什么?
前端·后端
东风破_13 小时前
JWT 5:路由守卫是什么?把整个 JWT 登录鉴权流程串起来
前端·后端