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

TypeScript类型定义:Interface与Type的全面对比与使用场景

在TypeScript中,interfacetype是两种定义类型的工具,它们在语法、功能和使用场景上既有相似之处,也有明显的区别。下面为你详细介绍两者的主要特点以及它们的差异。

一、interface的介绍

  1. 基本概念: interface(接口)是TypeScript中用于定义对象结构的主要工具,描述了对象应该具有的属性和方法,但不包含具体实现。
  2. 基本语法: interface 主要用于定义对象的结构,还支持继承、合并等操作。
// 基础接口
interface User {name: string;age?: number;readonly id: number;
}
// 继承
interface AdminUser extends User {role: string;
}// 合并
interface User {sex: string;
}
// 合并后,User {name: string; age?: number; readonly id: number; sex: string}

二、type 的介绍

  1. 基本概念: type(类型别名)是一种更通用的类型定义工具,可以用来定义任意类型,包括对象、原始类型、联合类型、元组等。
  2. 基本语法:
// 基础类型别名
type ID = string | number;// 对象类型别名
type User = {name: string;age?: number;readonly id: ID;
}// 联合类型
type Status = "active" | "inactive";// 交叉类型
type AdminUser = User & { role: string };// 元组
type OptionalTuple string number? boolean?;
const tuple1:OptionalTuple "first";// 只提供必填元素
const tuple2:OptionalTuple "second" 123 true;// 提供所有元素
type RestTuple string ...number[];
const tuple3:RestTuple "third" 1 2;// 使用包含剩余参数的元组类型// 函数类型
type Callback = (data: any) => void;// 映射类型
// 使用映射类型将所有属性变为可选属性
type PartialUser = { [P in keyof User]?: User[P]} 
// 使用映射类型将所有属性变为只读属性
type ReadonlyUser = { readonly [P in keyof User]: User[P]}
// 使用映射类型将所有属性的类型转换为字符串类型
type StringifyPerson = { [P in keyof Person ]: string }
// 定义一个新类型,仅选择部分属性
type PickNameAndAge = { [P in 'name' | 'age']: User[P]}

补充:
元组类型的特性:

  1. 固定长度:元组类型的长度是固定的,必须提供指定数量的原则。
  2. 不同类型:元组中的每个元素可以具有不同的类型。
  3. 可选原则:可以使用 ? 标记可选元素,这些元素可以省略。
  4. 剩余参数:可以使用 … 标记剩余参数,表示一个同类型的数组

应用场景:

  1. 函数参数: 在函数参数中使用元组类型,可以明确每个参数的类型和顺序。
  2. 返回值:函数返回多个不同类型的值时,可以使用元组类型。
  3. 数据结构:在需要固定长度和不同类型的数据结构时,可以使用元组类型。

映射类型的核心语法:

type MappedType = { [P in K]: T}
K: 表示一个键的联合类型, 通常使用 keyof 获取。
P in k:表示遍历联合类型k中的每个键P。
T:表示每个键P对应的值的类型。

应用场景:

  1. 属性转换:
    将属性变为可选或只读。
    修改属性的类型(如将所有属性转换为字符串类型)。
  2. 代码复用:
    基于现有类型快速创建新类型,减少重复代码。
  3. 类型安全
    通过映射类型确保某些属性不可变或必选,增强代码的健壮性。

三、interface 与 type 的主要区别:

特性interfacetype
定义范围只能描述对象类型可以描述任意类型如(string、number)
语法使用interface关键字使用type关键字
扩展方式通过extends实现继承通过&实现交叉类型
声明合并支持自动合并不支持,重复定义会报错
实现类类可以实现interface类无法实现type定义的联合类型
映射类型不支持映射类型可用于创建映射类型
基础类型别名不能直接为基础类型创建别名可以为基础类型创建别名

四、使用场景建议

  • 推荐使用interface的场景:
    定义对象结构,特别是需要被类实现时。
    需要声明合并来扩展类型,如扩展第三方库类型。
    构建大型类型层次结构,例如在库或者框架中。
  • 推荐使用type的场景:
    定义联合类型、交叉类型或者元组。
    需要更复杂的类型运算,如映射类型。
    需要引用基础类型,为原始类型或复杂类型创建别名。
    五、总结
    interface 和 type 是TypeScript中定义类型的两种重要工具,各有优势。interface更适合面向对象的设计和声明合并,而type更适合复杂类型运算和灵活的类型定义。根据具体需求选择合适的工具,能够显著提升代码的可维护性和可扩展性。
http://www.lryc.cn/news/573956.html

相关文章:

  • 线程池异步处理
  • 分布式ID生成方式及优缺点详解
  • 【Datawhale组队学习202506】YOLO-Master task03 IOU总结
  • uni-app项目实战笔记23--解决首次加载额外图片带来的网络消耗问题
  • 人工智能、机器人最容易取哪些体力劳动和脑力劳动
  • day03-微服务01
  • 《Nature Commun》(中科院1区, IF17.694): CITE-seq+空间转录组解析SSc免疫异质性
  • MySQL学习(1)——基础库操作
  • 【C++开发】CMake构建工具
  • 系统思考:救火先放火
  • (线性代数最小二乘问题)Normal Equation(正规方程)
  • 【边缘计算】ECA、ECN、ECI
  • 逆向某物 App 登录接口:还原 newSign 算法全流程
  • springboot 提供的可扩展接口
  • Element表格表头合并技巧
  • 30天pytorch从入门到熟练(day1)
  • VS2019调试进入FFmpeg源码
  • Vulkan 学习笔记15—Mipmap 与多重采样
  • 【webSocket】WebSocket全双工通信实战指南
  • 从零开始手写redis(15)实现自己的 HashMap
  • java专题漏洞总结 + 靶场练习
  • 【学习笔记】深入理解Java虚拟机学习笔记——第10章 前端编译与优化
  • RA4M2开发IOT(10)----集成LPS22DF气压计
  • 扫雷中的数学原理
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月22日第116弹
  • 64-Oracle Redo Log
  • 肖臻《区块链技术与应用》第六讲:比特币网络
  • 点点(小红书AI搜索):生活场景的智能搜索助手
  • 数据库(1)-SQL
  • C++ - 标准库之 <string> npos(npos 概述、npos 的作用)