当前位置: 首页 > news >正文

TypeScript中的type和interface的区别是什么?

在 TypeScript 里,typeinterface 都是用来定义类型的,但它们有一些相似之处重要区别

1. 相同点

  • 都可以用来描述对象的结构(属性、方法等)。

  • 都支持 可选属性(?只读属性(readonly

  • 都可以被扩展(extend / 继承)。

  • 都能用于函数参数、变量、返回值的类型声明。

例子:

type User1 = {name: string;age: number;
}interface User2 {name: string;age: number;
}const u1: User1 = { name: '张三', age: 18 };
const u2: User2 = { name: '李四', age: 20 };

2. 不同点

① 声明合并

  • interface 可以重复声明,TypeScript 会自动合并它们的成员。

  • type 不能重复声明(会报错)。

interface Person {name: string;
}
interface Person {age: number;
}
// 合并后:{ name: string; age: number; }
const p: Person = { name: '张三', age: 18 };type PersonType = { name: string; };
// ❌ 重复声明会报错
// type PersonType = { age: number; };

② 表示的范围

  • type 更广,不仅能表示对象类型,还能表示:

    • 基本类型别名

    • 联合类型

    • 交叉类型

    • 条件类型

    • 元组

  • interface 只能描述对象结构(对象、类、函数)。

// type 可以做这些:
type MyString = string;
type ID = number | string;
type Tuple = [string, number];
type Status<T> = T extends string ? 'ok' : 'fail';// interface 做不了这些:

③ 扩展方式

  • interfaceextends 来继承。

  • type交叉类型(& 来组合。

interface A {name: string;
}
interface B extends A {age: number;
}type C = { name: string };
type D = C & { age: number };

④ 实现类

  • interface 可以用 implements 让类去实现。

  • type 虽然也可以被类用来约束结构,但不能被 implements 直接继承联合类型等复杂类型(会有限制)。

interface Animal {name: string;
}
class Dog implements Animal {name = '旺财';
}

3. 如何选择?

  • 如果是定义对象结构(尤其是给类用),推荐用 interface(可合并、可继承)。

  • 如果需要用到联合类型 / 条件类型 / 元组 / 基本类型别名,只能用 type

  • 项目里混用是常见的

    • interface 描述数据结构

    • type 处理类型变换和复杂组合

📌 记忆口诀:

能用 interface 就用 interface,需要高级类型能力就用 type
interface 像积木,可以拼接扩展;
type 像模具,可以塑造各种形状。

type vs interface 对比表

特性 / 能力interfacetype
定义对象结构✅ 支持✅ 支持
定义函数类型✅ 支持✅ 支持
定义数组 / 元组❌ 不支持✅ 支持
定义基本类型别名(如 string, number❌ 不支持✅ 支持
联合类型(|)❌ 不支持✅ 支持
交叉类型(&)✅ 支持(extends✅ 支持(&
条件类型❌ 不支持✅ 支持
可重复声明并合并✅ 支持❌ 不支持
泛型支持✅ 支持✅ 支持
implements✅ 支持⚠️ 支持有限(复杂类型可能报错)
扩展方式extends& 交叉类型
适合场景数据结构、面向对象高级类型运算、类型组合

📌 口诀版记忆:

  • interface:更像“乐高积木”,能一块一块拼接(可合并、可继承)。

  • type:更像“模具”,能塑造各种奇形怪状(元组、联合、条件类型都能搞)。

http://www.dtcms.com/a/325021.html

相关文章:

  • Shell脚本-数组定义
  • OpenEnler等Linux系统中安装git工具的方法
  • DDR中的POD与ODT
  • 分布式事务原理(高并发系统下的数据一致性保障)
  • 一、线性规划
  • 免费数字人API开发方案
  • 高精度计算+快速幂算法
  • 【算法题】:斐波那契数列
  • 【langchain】如何给langchain提issue和提pull request?
  • SpringIoc 实践和应用--XML配置
  • 数据结构-deque(双端队列)和queue(队列)区别
  • Flask多进程数据库访问问题详解
  • spring全家桶使用教程
  • Lua语言元表、协同程序
  • 密码学的数学基础2-Paillier为什么产生密钥对比RSA慢
  • SQL三剑客:DELETE、TRUNCATE、DROP全解析
  • 深度相机---双目深度相机
  • 浏览器CEFSharp+X86+win7 之 浏览器右键菜单(六)
  • Mysql笔记-存储过程与存储函数
  • vulnhub-doubletrouble靶场攻略
  • Linux C文件操作函数
  • 谷歌DeepMind发布Genie 3:通用型世界模型,可生成前所未有多样化的交互式虚拟环境
  • C++移动语义、完美转发及编译器优化零拷贝
  • PostgreSQL 批量COPY导入优化参数配置
  • 近红外与可见光图像融合的多种方法实现
  • OpenAI正式发布GPT-5:迈向AGI的关键一步
  • Java基础-多线程
  • lesson34:深入理解Python线程:从基础到实战优化
  • hysAnalyser --- 支持文件转播UDP/RTP实时流功能
  • CompletableFuture实现Excel 多个sheet页批量导出