当前位置: 首页 > 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.xdnf.cn/news/1064575.html

相关文章:

  • 【HarmonyOS Next之旅】DevEco Studio使用指南(三十六) -> 配置构建(三)
  • 算法导论第二十五章 深度学习的伦理与社会影响
  • C4.5算法深度解析:决策树进化的里程碑
  • 怎么让二级域名绑定到wordpesss指定的页面
  • 0-机器学习简介
  • winform mvvm
  • opencv 之双目立体标定算法核心实现
  • STM32F103C8T6,窗口看门狗(WWDG)与独立看门狗(IWDG)详解
  • all()函数和any()函数
  • 【机器学习四大核心任务类型详解】分类、回归、聚类、降维智能决策指南
  • 【投稿与写作】overleaf 文章转投arxiv流程经验分享
  • 开发语言本身只是提供了一种解决问题的工具
  • Windows 后渗透中可能会遇到的加密字符串分析
  • C++结构体初始化与成员函数实现语法详解
  • webpack+vite前端构建工具 -6从loader本质看各种语言处理 7webpack处理html
  • c#websocket心跳包自定义实现,支持异步操作的取消
  • RN(React Native)技术应用中常出现的错误及解决办法
  • 可理解性输入:洗澡习惯
  • 【设计模式】策略模式 在java中的应用
  • 《Redis》事务
  • idea2023+zulu-jdk+maven3.9.10
  • 【后端】负载均衡
  • 解决OSS存储桶未创建导致的XML错误
  • LLMs之MCP:excel-mcp-server的简介、安装和使用方法、案例应用之详细攻略
  • 5.3 VSCode使用FFmpeg库
  • 一,python语法教程.内置API
  • modelscope设置默认模型路径
  • python中学物理实验模拟:凸透镜成像和凹透镜成像
  • springboot通过独立事务管理器实现资源隔离与精准控制​
  • C++ 函数模板