ts中的接口(interface)示例代码及解释

目录

什么是interface

示例代码

函数接口

通过接口(interface)来约束函数的基本使用

通过接口约束函数参数为函数类型

class接口

通过抽象类实现

抽象类和接口的区别

构造函数接口

接口的继承

接口继承接口

接口继承类


什么是interface

在 TypeScript 中,interface(接口)是一种用来描述对象形状的结构化类型。与其他语言中的接口概念类似,它定义了对象应该具有的属性和方法,但不提供具体的实现。与类相似,接口可以扩展其他接口,并且可以用于描述函数类型、数组类型等数据形态。在 TypeScript 中接口非常常用,因为它可以帮助开发人员更好地理解代码和规避错误,提高代码的可维护性和可读性。

示例代码
interface Person {name: string;age: number;
}const person: Person = {name: 'Tom',age: 18
};

定义了一个 Person 接口,它描述了一个拥有 name 和 age 属性的对象类型。我们可以将 person 对象的类型声明为 Person,并且确保它遵循了接口的结构。这样,在类型检查阶段,如果我们尝试为 person 对象赋值一个不符合接口的结构,就会在编译时期报错。

函数接口

在 TypeScript 中,我们可以使用接口来定义函数的类型。函数接口描述了函数的参数类型、返回值类型以及函数本身的结构。通过使用函数接口,我们可以对函数进行类型检查和约束。

通过接口(interface)来约束函数的基本使用
interface MathFunc {(x: number, y: number): number;
}const add: MathFunc = (a, b) => {return a + b;
};const multiply: MathFunc = (a, b) => {return a * b;
};

上面的代码定义了一个 MathFunc 函数接口,它描述了接受两个 number 类型的参数并返回 number 类型的函数。然后,我们可以使用该接口类型来声明变量 add 和 multiply,并实现函数的定义。在变量声明时,我们需要确保函数的结构与函数接口的描述一致,这样就可以进行类型检查和约束。

通过接口约束函数参数为函数类型
interface searchFunction {(kw:string, pgae?:number): string[]
}interface saveFunction {(data:object):void
}const searchAndSave = function(kw:searchFunction, save:saveFunction) {// code
}searchAndSave((kw:string) => {return ['a', 'b', 'c']
}, () => {})

`searchFunction` 描述了一个接受一个字符串类型的关键字参数 `kw` 和一个可选的数字类型的页码参数 `page`,返回一个字符串数组类型的函数。

`saveFunction` 描述了一个接受一个对象类型的参数 `data`,没有返回值的函数。

接下来,通过 `searchAndSave` 函数,将这两个函数接口作为参数进行组合。`searchAndSave` 函数接受一个参数 `kw`,它是一个符合 `searchFunction` 函数接口的函数,并且接受一个参数 `save`,它是一个符合 `saveFunction` 函数接口的函数。在 `searchAndSave` 函数的实现中,可以根据需要使用这两个参数进行相应的操作。

在代码示例的最后一行,调用了 `searchAndSave` 函数,并传入了两个匿名函数作为参数。

第一个匿名函数 `kw => ['a', 'b', 'c']` 符合 `searchFunction` 函数接口的定义,它接受一个字符串参数 `kw`,并返回一个字符串数组。

第二个匿名函数 `() => {}` 是一个空函数,没有实现任何功能,但它符合 `saveFunction` 函数接口的定义,它接受一个对象参数 `data`,没有返回值。

通过这种方式,我们可以在调用 `searchAndSave` 函数时,根据业务需求传入相应的函数,并保证它们的参数和返回值类型的一致性。

class接口

在 TypeScript 中,我们可以使用接口来描述类的结构和约束类的属性和方法。这种接口常被称为类接口(class interface)或者构造函数接口(constructor interface)。

类接口主要用于定义类的实例部分的属性和方法。通过定义类接口,我们可以对类的实例进行类型检查和约束。

interface Point {x: number;y: number;move(dx: number, dy: number): void;
}class MyPoint implements Point {x: number;y: number;constructor(x: number, y: number) {this.x = x;this.y = y;}move(dx: number, dy: number) {this.x += dx;this.y += dy;}
}const point = new MyPoint(1, 2);
point.move(3, 4);
console.log(point.x, point.y);  // 输出: 4, 6

我们定义了一个类接口 Point,它描述了一个具有 x 和 y 属性,以及一个用于移动坐标的 move 方法的类。然后,我们创建了一个类 MyPoint,该类实现了 Point 接口。

在 MyPoint 类中,我们需要确保类的实例具有 x 和 y 属性,并实现了 move 方法的定义。通过实现接口,我们可以在编译时检查类的实例是否符合接口的要求。

最后,我们创建了一个 MyPoint 类的实例 point,并进行了一次坐标的移动。我们可以看到,通过类接口的约束,我们可以更好地对类的结构进行定义和约束。

通过抽象类实现

抽象类是一种特殊的类,它不能直接被实例化,而是用于作为其他类的基类(父类)。抽象类可以包含抽象方法和非抽象方法,并且可以提供一些基本的实现,让子类来继承和扩展。

abstract class Point {abstract x: number;abstract y: number;abstract move(dx: number, dy: number): void;
}class MyPoint extends Point {x: number;y: number;constructor(x: number, y: number) {super();this.x = x;this.y = y;}move(dx: number, dy: number) {this.x += dx;this.y += dy;}
}const point = new MyPoint(1, 2);
point.move(3, 4);
console.log(point.x, point.y);  // 输出: 4, 6

在上面的例子中,我们定义了一个抽象类 Point,它包含了抽象属性 x 和 y,以及抽象方法 move。抽象方法不包含具体的实现,而是留给子类去实现。

然后,我们创建了一个子类 MyPoint,该类继承自抽象类 Point。在子类中,我们必须实现抽象类中所有的抽象属性和方法。

最后,我们创建了一个 MyPoint 类的实例 point,并进行了一次坐标的移动。输出结果与之前的示例相同。

抽象类和接口的区别

抽象类和接口是 TypeScript 中用于定义和约束类和对象行为的关键概念,它们有以下几点区别:

1. 实例化: 接口不能被实例化,而抽象类也不能直接被实例化,只能作为其他类的基类。

2. 实现限制: 类可以实现多个接口,但只能继承一个抽象类。

3. 成员实现: 接口中的成员都是抽象的,没有具体的实现细节,而抽象类可以包含具体的成员实现。

4. 属性和方法: 接口可以包含属性、方法、索引签名和构造签名等成员,而抽象类可以包含属性、方法(包括抽象方法和具体方法)、构造函数和访问修饰符等成员。

5. 多态性: 抽象类可以实现多态,通过在基类中定义抽象方法来强制子类必须实现该方法。而接口无法实现多态,只能用于描述对象的结构。

6. 继承关系: 抽象类可以继承其他类或抽象类,也可以实现接口。而接口只能继承其他接口,不能直接继承类。

7. 用途: 抽象类适用于定义一些相似的子类,通过继承抽象类来避免重复代码并实现代码复用。接口常用于描述对象的结构,用于类型检查和约束。

抽象类主要用于定义类的共性和结构,可以包含具体的实现细节;而接口主要用于描述对象的结构,强调规范和约束,不包含具体的实现细节。

抽象类更适合用于具有相似行为的类的继承和扩展,而接口更适合用于对象的类型检查和约束。

构造函数接口

构造函数接口用于描述一个类的构造函数的类型。通过构造函数接口,我们可以定义类的构造函数参数的类型和返回的实例类型。

interface Point {x: number;y: number;
}interface PointConstructor {new (x: number, y: number): Point;
}class MyPoint implements Point {x: number;y: number;constructor(x: number, y: number) {this.x = x;this.y = y;}
}const PointClass: PointConstructor = MyPoint;
const point: Point = new PointClass(1, 2);
console.log(point.x, point.y);  // 输出: 1, 2

接口的继承

接口之间可以通过继承来建立关系,使一个接口可以继承另一个或多个接口的成员。接口的继承可以通过关键字 extends 来实现。

接口继承接口
interface Box {area():number;length():number;
}interface Box2 extends Box {volumn():number;
}// Box3这个类需要同时实现Box和Box2中的方法
class Box3 implements Box2 {area() {return 1}length() {return 2}volumn() {return 3;}
}
接口继承类
class Box {protected uname:string = 'zs';
}interface Box2 extends Box {pwd:string;
}class Box3 extends Box implements Box2 {pwd:string;constructor(pwd:string) {super();this.pwd = pwd}showName() {console.log(this.uname)console.log(this.pwd)}
}let b = new Box3('123456')
b.showName()

继承接口可以实现接口之间的层次关系,使得接口能够更好地组织和描述对象的结构和行为。同时,这也提供了代码共享和重用的机制,有助于增强代码的可读性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【高性能篇】QPS概念、RT概念

什么是QPS,什么是RT? ✔️典型解析✔️扩展知识仓✔️RT ✔️QPS✔️ QPS和TPS✔️并发用户数✔️最佳线程数 ✔️典型解析 QPS,指的是系统每秒能处理的请求数(Query Per Second),在Web应用中我们更关注的是Web应用每秒能处理的re…

Radar System Pro - Plug Play Solution

Radar System Pro是一款功能多样且可定制的资源,旨在通过功能齐全且易于使用的雷达系统增强您的Unity项目。无论您是在开发第一人称射击游戏、策略游戏还是太空探索模拟器,我们的雷达系统都将为您提供所需的工具,以创建引人入胜且身临其境的体验。 雷达系统是一个模块化资产…

2023年华为OD机试(python)B卷-符合要求的结对方式

一、题目 题目描述: 用一个数组A代表程序员的工作能力,公司想通过结对编程的方式提高员工的能力,假设结对后的能力为两个员工的能力之和,求一共有多少种结对方式使结对后能力为N。 二、输入输出 输入描述: 5 1 2 2 2 3 4 第一行为…

Unity 贝塞尔曲线工具获取运动轨迹

Unity 贝塞尔曲线工具获取运动轨迹 一、介绍贝塞尔曲线二、Unity中贝塞尔曲线工具介绍1.创建一个空物体挂在上BezierSpline.cs脚本组件2.由上图可知刚创建出来的有两个点和两个手柄组成3.我们可修改其坐标看下效果4.这样我们就可以获得这两个点之间的指定数量的点来作为某个物体…

openGauss学习笔记-177 openGauss 数据库运维-逻辑复制-逻辑解码-逻辑解码概述

文章目录 openGauss学习笔记-177 openGauss 数据库运维-逻辑复制-逻辑解码-逻辑解码概述177.1 功能描述177.2 注意事项177.3 性能 openGauss学习笔记-177 openGauss 数据库运维-逻辑复制-逻辑解码-逻辑解码概述 177.1 功能描述 openGauss对数据复制能力的支持情况为&#xff…

资助26项!基金委公布一批原创探索项目资助结果!

根据《国家自然科学基金原创探索计划项目实施方案(试行)》要求,现将2023年度数理科学部资助的专项项目(指南引导类原创探索计划项目)相关信息予以公示: 国家自然科学基金委员会 数理科学部 2023年12月26日…

TypeScript 中 never 和 void 的区别

在 TypeScript 中,never 和 void 都是用来表示函数的返回类型或表达式的类型,但有着不同的含义。 void 表示函数没有返回值,也可以用作变量的类型,表示变量不接收任何值。在函数中,void 表示函数没有返回任何值&#…

es修改mapping映射

在Elasticsearch中,一旦一个字段被创建,它的数据类型通常是固定的,不能直接修改。这是因为Elasticsearch是基于倒排索引的,字段的数据类型在创建索引时确定,并且与索引的结构相关联。 然而,如果确实需要更…

Linux 内核学习笔记: hlist 的理解

前言 最近阅读 Linux 内核时,遇到了 hlist,这个 hlist 用起来像是普通的链表,但是为何使用 hlist,hlist 是怎么工作的? 相关代码 hlist_add_head(&clk->clks_node, &core->clks); /*** clk_core_link_…

开题答辩ppt模板和逻辑

PPT模板和逻辑 分三个部分 1. 立题依据、研究内容 2. 技术路线、技术创新 3. 工作基础、进度安排 Part1:3页 1.1 选题背景 背景1、背景2、背景3(纵向递进式or横向并列式,每一个是一个新信息。) optional:冲突/问…

vue3项目使用pako库解压后端返回zip数据

文章目录 前言一、pako 介绍一些特点和功能:简单示例 二、vue3 实战示例1.安装后引入库安装:引用用自定义hooks 抽取共用逻辑部署小插曲 前言 外部接口返回一个图片数据是经过zip压缩的,前端需要把这个数据处理成可以显示的图片。大概思路:z…

68内网安全-域横向PTHPTKPTT哈希票据传递

今天讲PTH&PTK&PTT, PTH(pass the hash) #利用 lm 或 ntlm 的值进行的渗透测试 PTT(pass the ticket) #利用的票据凭证 TGT 进行的渗透测试 用的Kerberos 协议 PTK(pass the key) #利用的 ekeys aes256 进行的渗透测试 lm加密算法是2003以前的老版&…

vitis HLS中实现canny算法的IP核

一、前言 canny边缘检测主要用于提取图像的边缘,是最常用且有效的边缘检测算法。在AMD赛灵思提供的库函数中,使用xf::cv::Canny和xf::cv::EdgeTracing两个函数实现canny边缘提取。本文举例说明如何在vitis HLS 2023.1中实现canny算法。 二、xf::cv::Cann…

JUC常用并发工具类

JUC常用并发工具类 1、什么是JUC? JUC 就是 java.util.concurrent 包,这个包俗称 JUC,里面都是解决并发问题的一些东西,该包的位置位于 java 下 面的 rt.jar 包下面。 2、4大常用并发工具类 2.1 CountDownLatch CountDownLatch&#x…

基于Java车间工时管理系统(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

《新传奇》期刊投稿论文发表

《新传奇》杂志是经国家新闻出版总署批准、面向国内外公开发行的综合性社科期刊,由湖北省文联主管,湖北今古传奇传媒集团有限公司主办,湖北优秀期刊。本刊旨在坚守初心、引领创新,展示高水平研究成果,支持优秀学术人才…

flink中值得监控的几个指标

背景 为了维持flink的正常运行,对flink的日常监控就变得很重要,本文我们就来看一下flink中要监控的几个重要的指标 重要的监控指标 1.算子的处理速度的指标:numRecordsInPerSecond/numRecordsOutPerSecond,这有助于你了解到算子的是否正在…

如何使用 NFTScan NFT API 在 Gnosis 网络上开发 Web3 应用

Gnosis Chain 是一个兼容 EVM 的区块链,专注于快速且低成本的交易功能,采用独特的双通证模型;xDai 是一种用于交易、支付和手续费的稳定币,权益证明(PoS)保护将由 GNO 通过共识层 Gnosis Beacon Chain 提供…

【JVM】虚拟机的组成+字节码文件组成+类的生命周期

什么是JVM? JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 JVM的功能 1.解释和运行:对字节码文件中的指令实时的解释成机器码让计算机执行。 2.内存管理:自动为对象、方法等分配内存,自动…