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

接口继承与扩展的使用技巧

在 TypeScript 中,接口继承和扩展是非常强大且灵活的功能,可以帮助我们更高效地管理类型和提高代码的可重用性。接口继承使得一个接口可以从另一个接口继承属性和方法,而接口扩展允许我们通过组合多个接口来构建更复杂的结构。这些特性使得 TypeScript 在类型系统上更加动态和灵活。

本文将深入探讨接口继承和扩展的使用技巧,帮助你在实际开发中更好地运用这些功能。

1. 接口继承的基础

接口继承允许一个接口继承另一个接口的属性和方法。继承后的接口会拥有父接口所有的成员,同时还可以添加新的成员或修改继承的成员。

示例:基本的接口继承
interface Animal {name: string;speak(): void;
}interface Dog extends Animal {breed: string;
}const dog: Dog = {name: 'Buddy',breed: 'Golden Retriever',speak() {console.log('Woof!');},
};dog.speak();  // 输出:Woof!

解释:

  • Dog 接口继承了 Animal 接口,意味着 Dog 接口拥有了 name 和 speak 属性,同时它还增加了 breed 属性。
  • 通过继承,Dog 可以重用 Animal 的成员定义,而无需重复代码。

2. 多重继承与接口组合

TypeScript 允许一个接口继承多个接口。通过组合多个接口,可以创建一个复杂的类型结构。这个特性使得 TypeScript 在构建类型时非常灵活。

示例:接口的多重继承
interface Living {alive: boolean;eat(): void;
}interface Animal {name: string;speak(): void;
}interface Pet extends Living, Animal {breed: string;
}const pet: Pet = {name: 'Tommy',breed: 'Bulldog',alive: true,speak() {console.log('Woof!');},eat() {console.log('Eating...');},
};pet.speak();  // 输出:Woof!
pet.eat();    // 输出:Eating...

解释:

  • Pet 接口继承了 Living 和 Animal 接口,意味着 Pet 拥有了这两个接口中的所有属性和方法。
  • 这样,Pet 类型就可以同时具备 Living 和 Animal 的功能,非常适用于复杂类型的构建。

3. 扩展接口的技巧

接口扩展是将现有接口与新接口结合的过程。通过接口扩展,可以在不修改原始接口的情况下,扩展其功能。这样做可以确保代码的模块化和高内聚性。

示例:接口扩展和合并
interface Vehicle {brand: string;model: string;
}interface ElectricVehicle extends Vehicle {batteryCapacity: number;
}const electricCar: ElectricVehicle = {brand: 'Tesla',model: 'Model S',batteryCapacity: 100,
};console.log(electricCar);  // 输出:{ brand: 'Tesla', model: 'Model S', batteryCapacity: 100 }

解释:

  • ElectricVehicle 接口继承了 Vehicle 接口,因此 ElectricVehicle 拥有 Vehicle 中的 brand 和 model 属性,并且添加了 batteryCapacity 属性。
  • 通过继承,ElectricVehicle 增强了 Vehicle 的功能,但不会影响 Vehicle 的定义。

4. 使用接口扩展实现代码复用

接口扩展的一个重要应用场景是代码复用。当你希望扩展现有接口而不修改它时,扩展接口可以非常有效地实现这一点。

示例:接口扩展与代码复用
interface Employee {id: number;name: string;
}interface Manager extends Employee {department: string;
}interface Developer extends Employee {programmingLanguages: string[];
}const manager: Manager = {id: 1,name: 'Alice',department: 'Engineering',
};const developer: Developer = {id: 2,name: 'Bob',programmingLanguages: ['JavaScript', 'TypeScript'],
};console.log(manager, developer);

解释:

  • Manager 和 Developer 都继承了 Employee 接口,因此它们共享 id 和 name 属性。
  • 然后,Manager 增加了 department 属性,而 Developer 增加了 programmingLanguages 属性。通过接口扩展,我们成功地复用了 Employee 中的字段。

5. 可选属性与继承

在继承时,可以为接口中的某些属性标记为可选的(使用 ?)。这样可以允许子接口在继承父接口时选择性地定义这些属性。

示例:继承可选属性
interface Person {name: string;age: number;address?: string;
}interface Employee extends Person {jobTitle: string;
}const employee: Employee = {name: 'John',age: 30,jobTitle: 'Software Engineer',
};console.log(employee);  // 输出:{ name: 'John', age: 30, jobTitle: 'Software Engineer' }

解释:

  • Person 接口中的 address 属性是可选的,因此在 Employee 接口中,address 并不是必须的。
  • employee 对象没有提供 address 属性,代码依然合法。

6. 使用接口继承约束类

接口继承不仅限于对象类型,类也可以实现接口,类通过继承接口来确保实现接口规定的属性和方法。这样,我们可以用接口来约束类的结构。

示例:类实现接口继承
interface Shape {area(): number;
}class Rectangle implements Shape {constructor(private width: number, private height: number) {}area(): number {return this.width * this.height;}
}const rectangle = new Rectangle(5, 10);
console.log(rectangle.area());  // 输出:50

解释:

  • Shape 接口规定了一个 area 方法,Rectangle 类通过 implements 关键字实现了这个接口,并提供了 area 方法的具体实现。
  • 继承接口不仅可以用于对象,还可以用于类,从而约束类的结构。

7. 接口的合并与命名空间扩展

接口支持声明合并,即多个同名接口可以合并成一个接口。这是 TypeScript 特有的功能,尤其在扩展已有类型库时非常有用。

示例:接口合并
interface Window {title: string;
}interface Window {size: number;
}const windowObj: Window = {title: 'Main Window',size: 800,
};console.log(windowObj);  // 输出:{ title: 'Main Window', size: 800 }

解释:

  • TypeScript 会自动将两个同名的 Window 接口合并成一个接口,合并后,Window 类型拥有了 title 和 size 两个属性。
  • 这种特性对于模块扩展或与外部库兼容时尤其有用。

8. 总结

接口继承与扩展是 TypeScript 强大的类型系统的一部分。通过接口继承,我们能够创建更灵活、可重用的类型结构;通过接口扩展,我们可以将多个接口组合在一起,从而应对更复杂的类型需求。使用接口继承和扩展时,应该遵循以下技巧:

  • 利用接口继承,避免重复代码,增强类型重用。
  • 使用多重继承组合多个接口,构建复杂类型。
  • 利用接口扩展,保持代码的模块化和高内聚性。
  • 接口合并和命名空间扩展是 TypeScript 特有的功能,适用于与外部库兼容或类型扩展。


 希望这篇博客对你有所帮助!如果有任何问题或建议,欢迎留言讨论。

相关文章:

接口继承与扩展的使用技巧

在 TypeScript 中,接口继承和扩展是非常强大且灵活的功能,可以帮助我们更高效地管理类型和提高代码的可重用性。接口继承使得一个接口可以从另一个接口继承属性和方法,而接口扩展允许我们通过组合多个接口来构建更复杂的结构。这些特性使得 T…...

【React】Craco 简介

Craco 简介 Craco (Create React App Configuration Override) 是一个用于自定义 Create React App (CRA) 配置的工具,无需 eject(弹出)项目。 为什么需要 Craco Create React App 虽然提供了零配置的 React 开发体验,但其配置…...

HTML5中的Microdata与历史记录管理详解

Microdata 简介 Microdata 是 HTML5 引入的一种标记方式,用于在网页中嵌入机器可读的语义信息。通过使用 Microdata,开发者可以在 HTML 元素中添加特定的属性,以便搜索引擎和其他工具更好地理解网页内容。 Microdata 的核心属性包括 itemsc…...

UNet网络 图像分割模型学习

UNet 由Ronneberger等人于2015年提出,专门针对医学图像分割任务,解决了早期卷积网络在小样本数据下的效率问题和细节丢失难题。 一 核心创新 1.1对称编码器-解码器结构 实现上下文信息与高分辨率细节的双向融合 如图所示:编码器进行了4步&…...

Babel 深度解析:现代 JavaScript 开发的桥梁

1. 什么是 Babel? Babel 是一个 JavaScript 编译器(又称转译器),核心使命是解决 JavaScript 的环境兼容性问题。它允许开发者使用最新的语言特性(如 ES6、JSX、TypeScript),同时将代码转换为旧…...

MyBatis源码解读2(2.1、核心对象)

二、MyBatis的核心对象 2.1、核心对象 2.1、MappedStatement MyBatis其实是对JDBC的进一步封装,我们都知道JDBC有几个重要的对象: StatementPrepared StatementCallable StatementResultSet Statement、Prepared Statement、Callable Statement分别…...

03.three官方示例+编辑器+AI快速学习webgl_animation_multiple

本实例主要讲解内容 这个示例展示了Three.js中骨骼动画的高级应用技巧,重点演示了如何使用SkeletonUtils.clone()方法复制模型,并展示了两种不同的骨骼动画管理方式: 独立骨骼模式:每个模型拥有独立的骨骼结构,可播放…...

无锁秒杀系统设计:基于Java的高效实现

引言 在电商促销活动中,秒杀场景是非常常见的。为了确保高并发下的数据一致性、性能以及用户体验,本文将介绍几种不依赖 Redis 实现的无锁秒杀方案,并提供简化后的 Java 代码示例和架构图。 一、基于数据库乐观锁机制 ✅ 实现思路&#xf…...

MyBatis快速入门——实操

默认:电脑搭建好了Maven环境 本次入门实验使用的idea版本:ideaU2022.1 目录 一:前期准备工作 1. 创建一个springboot工程 2. Maven环境配置 3. 在mysql数据库中创建一个user表 4. 编写实体类User 二: 引入MyBatis的相关依赖…...

假如你的项目是springboot+vue怎么解决跨域问题

1. 前端代理(开发环境推荐) 适用场景:Vue 开发环境调试时,避免直接请求后端接口的跨域问题。 实现步骤: 在 Vue 项目的 vue.config.js 中配置代理: module.exports {devServer: {proxy: {/api: { // 代理…...

OpenResty反向代理

通过在 OpenResty 的配置文件中定义不同的 location 块,将匹配特定 URL 路径的请求转发到不同的后端 FastAPI 应用(即使它们运行在不同的端口或甚至是不同的服务器/容器上)。 核心思路: 多个 FastAPI 应用实例: 你的每…...

《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions)

《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions) 在 Python 中,条件表达式(conditional expressions)提供了一种简洁的方式来在一行中实现 if/else 的逻辑。它…...

【Typenum】 3 类型位运算(bit.rs)

一、源码 代码定义了一个类型级别的位(bit)系统,主要用于编译时的类型运算。 //! 类型级比特位实现 //! //! 这些是基础的比特位类型,作为本库中其他数值类型的构建基础 //! //! 已实现的**类型运算符**: //! //! - …...

python:trimesh 用于 STL 文件解析和 3D 操作

python:trimesh 是一个用于处理三维模型的库,支持多种格式的导入导出,比如STL、OBJ等,还包含网格操作、几何计算等功能。 Python Trimesh 库使用指南 安装依赖库 pip install trimesh Downloading trimesh-4.6.8-py3-none-any.w…...

stm32week15

stm32学习 十一.中断 2.NVIC Nested vectored interrupt controller,嵌套向量中断控制器,属于内核(M3/4/7) 中断向量表:定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址,中断向量表定…...

数据库分库分表实战指南:从原理到落地

1. 为什么要分库分表? 1.1 单库瓶颈表现 存储瓶颈:单表数据超过5000万行,查询性能急剧下降性能瓶颈:单库QPS超过5000后响应延迟显著增加可用性风险:单点故障导致全系统不可用 1.2 突破性优势 --------------------…...

雷达工程师面试题目

雷达工程师面试题目 一、基础知识类 简述雷达的工作原理 请从电磁波的发射、传播、反射以及回波接收处理等环节,详细阐述雷达如何实现对目标的探测、定位与跟踪。 常见雷达体制及其特点 列举至少三种常见的雷达体制(如脉冲雷达、连续波雷达、相控阵雷达等),并分别说明…...

JVM-类加载子系统

最近在学习JVM,分模块整理一下JVM的笔记 目录 类加载子系统 一、加载 二、链接 1.验证 2.准备 3.解析 三、初始化 类加载子系统 类加载子系统负责将字节码文件加载到虚拟机中,我们正常编写完一个Java类并在前端编译器编译后会生成一个对应的字节码…...

从0开始学习大模型--Day06--大模型的相关网络架构

云服务器 在平时,我们总能听到诸如用服务器跑数据、模型,或者是搭建服务器之类的话,实际上,它相当于一台算力、内存、运行内存等各个方面都很强大的电脑,只需要我们用自己的电脑通过互联网链接他就能使用它&#xff0…...

控制LED灯设备

本章分别使用C库和系统调用的文件操作方式控制开发板的LED灯,展示如何在应用层通过系统提供的设备文件控制相关硬件。 本章的示例代码目录为:base_code/linux_app/led/sys_class_leds。 9.1. LED子系统 在Linux系统中,绝大多数硬件设备都有…...

Three.js + React 实战系列 - 联系方式提交表单区域 Contact 组件✨(表单绑定 + 表单验证)

对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦!!谢谢大家!!! 在现代网页中,一个精致的 Contact 区域不仅仅是表单的堆砌,更是用户与我们建立联系的第一印象。 在本节课中,我…...

Python-MCPAgent开发-DeepSeek版本

Python-MCPAgent开发-DeepSeek版本 尝试Windows使用Python完成【McpServer】【McpAgent】开发,当前使用OpenAI-Agents框架进行开发 1-核心知识点 先完成【LLM】配置再完成【McpServer】开发再完成【Agent】开发完成【LLM】【McpServer】【Agent】请求互通 2-思路整…...

Linux:43线程封装与互斥lesson31

mmap文件映射视屏:待看... 目录 线程栈 代码证明:一个线程的数据,其他线程也可以访问 线程封装 简单封装,2.thread Thread.hpp Main.cc Makefile 结果: ​编辑 问题1: 问题2: lamba表达式 模版封…...

stm32测频率占空比最好的方案

频率检测, 方案方法很多种, 其中最快最节省资源的方法. 分享给大家. 其它的方案都试过, 问题多多. 适合单片机在工业应用中, 1MHZ以下的频率检测. 1MHZ估计也行. 但是偏差估计是变大了. 我试过很多种方案, 可以看我前面的文章. 最后发现目前这种方案最为优秀. 主要特点为不占用…...

Redis--常见数据类型List列表

目录 一、概念 二、命令 2.1 LPUSH 2.2 LPUSHX 2.3 RPUSH 2.4 RPUSHX 2.5 LRANGE 2.6 LPOP 2.7 RPOP 2.8 LINDEX 2.9 LINSERT 2.10 LLEN 2.11 阻塞版本命令 三、内部编码 一、概念 列表类型是用来存储多个有序的字符串,列表中的每个字符串称为元素&…...

Linux : 多线程【线程概念】

Linux : 多线程【线程概念】 (一)线程概念线程是什么用户层的线程linux中PID与LWP的关系 (二) 进程地址空间页表(三) 线程总结线程的优点线程的缺点线程异常线程用途 (一)线程概念 线程是什么 在一个程序里的一个执行…...

React+Springboot项目部署ESC服务器

记录一下我个人部署Linux服务器的心得 环境介绍 ESC服务器创建时默认安装LNMP,即Linux,Nginx,Mysql,Php 所以这里不讲怎么安装Nignx和Mysql 笔者使用的Linux版本为22.0.4LTS版 前端打包 运行React打包命令进行前端项目的打包…...

python-Pandas库详细教程

python-Pandas库详细教程1 定义使用方法: 一、导入Pandas库代码 二、DataFrame用法Pandas索引 groupby()数值计算 定义 python中特定用于数据分析、处理的模板库。 优点: 处理数据便捷、简单。 使用方法: 处理“.csv”数据:rea…...

力扣刷题Day 46:搜索二维矩阵 II(240)

1.题目描述 2.思路 方法1:分别找到搜索矩阵的右、下边界,然后从[0][0]位置开始遍历这部分矩阵搜索目标值。 方法2:学习Krahets佬的思路,从搜索矩阵的左下角开始遍历,matrix[i][j] > target时消去第i行&#xff0c…...

C++:类和对象4

一,日期类实现 学习建议: 对于计算机学习来说,调试十分重要,所以在日常学习中一定要加大代码练习,刷代码题和课后自己敲出课上代码例题,注意不要去对比正确代码或者网上找正确代码直接使用,一…...

【软件工程】基于机器学习的多缺陷定位

基于机器学习的多缺陷定位(Multi-Dault Localization, MDL)是软件工程和自动化测试领域的重要研究方向,旨在通过机器学习技术高效识别代码中多个潜在缺陷的位置。以下从方法、挑战、应用场景及未来方向展开分析: 一、核心方法 监督…...

互联网大厂Java求职面试实战:Spring Boot到微服务的技术问答解析

💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...

LLMs之MCP:2025年5月2日,Anthropic 宣布 Claude 重大更新:集成功能上线,研究能力大幅提升

LLMs之MCP:2025年5月2日,Anthropic 宣布 Claude 重大更新:集成功能上线,研究能力大幅提升 导读:2025年5月2日,Anthropic 宣布 Claude 推出 Integrations 集成功能和增强型高级研究功能。Integrations 基于 …...

飞蛾扑火算法matlab实现

注意:此代码实现的是求目标函数最大值,求最小值可将适应度函数乘以-1(框架代码已实现)。 注意:此代码实现的是求目标函数最大值,求最小值可将适应度函数乘以-1(框架代码已实现)。 注…...

vector--OJ1

链接: link class Solution { public:int singleNumber(vector<int>& nums) {int ret0;for(auto a : nums){ret^a;}return ret;} };链接: link class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>>…...

多模态大语言模型arxiv论文略读(六十八)

Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文标题&#xff1a;Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文作者&#xff1a;Qiji Zhou, Ruoc…...

【数据库知识】Mysql进阶-高可用MHA(Master High Availability)方案

mysql高可用MHA&#xff08;Master High Availability&#xff09;方案 集群部署模式下的高可用方案一、高可用架构原理1. 核心组件2. 故障切换流程 二、详细部署步骤 (3节点集群)1. 环境准备2. 节点配置&#xff08;以 node1 为例&#xff09;3. 初始化集群4. 部署MySQL Route…...

类型别名与接口的对比与选择

在 TypeScript 中&#xff0c;类型系统是非常强大且灵活的。两种最常用的类型定义方式就是 类型别名&#xff08;type&#xff09; 和 接口&#xff08;interface&#xff09;。它们看似相似&#xff0c;实际上在用法和功能上有所不同。在本文中&#xff0c;我们将深入探讨类型…...

《Effective Python》第1章 Pythonic 思维详解——始终用括号包裹单元素元组

《Effective Python》第1章 Pythonic 思维详解——始终用括号包裹单元素元组 在 Python 编程语言中&#xff0c;元组&#xff08;tuple&#xff09;是一种不可变的数据结构&#xff0c;常用于表示一组固定的值。尽管元组的语法看似简单&#xff0c;但其中却隐藏着一些微妙的陷…...

【计算机视觉】OpenCV实战项目:ETcTI_smart_parking智能停车系统深度解析

ETcTI_smart_parking智能停车系统深度解析 1. 项目概述2. 技术原理与系统架构2.1 核心算法1) 车牌识别算法2) ETC交易验证 2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 硬件部署规范3.3 系统初始化 4. 常见问题与解决方案4.1 ETC交易失败4.2 车牌识别异常4.3 系统性能瓶颈 5.…...

LintCode第807题-回文数II

描述 判断一个非负整数 n 的二进制表示是否为回文数 我们保证 0 < n < 2^32 - 1 样例1 输入: n 0 输出: True 解释: 0 的二进制表示为&#xff1a;0。 样例2 输入: n 3 输出: True 解释: 3 的二进制表示为&#xff1a;11。 样例3 输入: n 4 输出: False 解释:…...

快速傅里叶变换暴力涨点!基于时频特征融合的高创新时间序列分类模型

往期精彩内容&#xff1a; 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门&#xff01;锂电池剩余寿命预测&#xff08;Python&#xff09;-CSDN博客 超强预测模型&#xff1a;二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;BiLSTM-Attention预测模型…...

股指期货的保证金交易和资金门槛是多少?

股指期货和股票交易最大的区别&#xff0c;就是它不用“全款买房”&#xff0c;而是“首付买房”——只需交一笔保证金就能撬动大额资金&#xff0c;但这也说明了门槛高、风险大。下面就来拆解&#xff0c;到底要准备多少钱才能“上车”。 一、保证金交易&#xff1a;用12万撬…...

spark:map 和 flatMap 的区别(Scala)

场景设定 假设有一个包含句子的 RDD&#xff1a; scala val rdd sc.parallelize(List("Hello World", "Hi Spark")) 目标是&#xff1a;将每个句子拆分成单词。 1. 用 map 的效果 代码示例 scala val resultMap rdd.map(sentence > sentence…...

判断两台设备是否在同一局域网内的具体方法

以下是判断两台设备是否在同一局域网内的具体方法&#xff1a; 1. 检查IP地址和子网掩码 操作步骤&#xff1a; Windows系统&#xff1a; 按 Win R 键&#xff0c;输入 cmd 并回车。输入 ipconfig&#xff0c;查看 IPv4 地址 和 子网掩码&#xff08;如 192.168.1.5/255.255.2…...

cmake:test project

本文主要探讨cmake在测试和项目中的应用。 add_test add_test(NAME <name> COMMAND <command> [<arg>...] [CONFIGURATIONS <config>...] [WORKING_DIRECTORY <dir>] [COMMAND_EXPAND_LISTS])  add_test(NAME test_uni COMMAND $<TARGET_F…...

Qwen-2.5 omni

问题1 Qwen2.5-Omni的主要功能是什么&#xff1f; Qwen2.5-Omni的主要功能是处理和生成多种模态的数据&#xff0c;包括文本、图像、音频和视频。它能够同时理解和生成这些模态的信息&#xff0c;支持复杂的多模态任务&#xff0c;例如语音对话、视频理解、图像描述生成等。 …...

Problem D: 异常2

1.题目描述 检查危险品程序&#xff1a;生成货物类、机器类&#xff0c;货物类有属性name&#xff0c;机器类有检测的check方法&#xff0c;若货物名称是炸弹、毒药、刀具&#xff0c;则抛出异常提示。 代码如下&#xff1a; import java.util.Scanner; class goods{ Stri…...

AI智慧公园管理方案:用科技重塑市民的“夜游体验”

AI智慧公园管理方案&#xff1a;多场景智能巡检与安全防控 一、背景与痛点分析 夏季夜间&#xff0c;公园成为市民休闲娱乐的核心场所&#xff0c;但管理难度随之激增&#xff1a; 宠物管理失控&#xff1a;未牵绳宠物进入园区&#xff0c;随地排泄、惊扰游客&#xff0c;甚…...

AJAX原理

AJAX使用XHR 对象和服务器进行数据交互 XHR <p class"my-p"></p><script>const xhr new XMLHttpRequest()xhr.open(GET,http://hmajax.itheima.net/api/province)xhr.addEventListener(loadend,()>{// console.log(xhr.response)const data …...