Typescript - interface 关键字(通俗易懂的详细教程)

news2024/11/29 10:44:00

前言

简单来说,Interface 就是一种描述对象或函数的东西。

您可以把 interface 理解为形状,真实开发情况下,一个对象需要有什么样的属性,函数需要什么参数或返回什么样的值,数组应该是什么样子的,一个类和继承类需要符合什么样的描述等。

本文分为七个部分,对象接口、函数接口、可索引类型接口、类接口是如何定义的,以及接口的继承、定义混合类型的接口和继承类的接口如何使用。

Interface 对象

定义一个 Interface 对象,一般分为以下步骤:

  1. 设置需要存在的普通属性
  2. 设置可选属性
  3. 设置只读属性
  4. 接受其他额外属性(通过 as 关键字或 [propName: string]: any 来制定)

来看个简单的示例,注意看注释:

// 按上面步骤规定"形状"
interface Person {
    name: string
    bool?: boolean
    readonly timestamp: number
    readonly arr: ReadonlyArray<number> // 此外还有 ReadonlyMap/ReadonlySet
}

// 正确示例
let p1: Person = {
    name: 'oliver',
    bool: true, // ✔️️ 可以设置可选属性 并非必要的 可写可不写
    timestamp: + new Date(), // ✔️ 设置只读属性
    arr: [1, 2, 3] // ✔️ 设置只读数组
}

// 错误示例
let p: Person = {
    age: 'oliver', // ❌ 多出来的属性
    name: 123 // ❌ 类型错误
}

// 错误示例
p1.timestamp = 123 // ❌ 只读属性不可修改
p1.arr.pop() // ❌ 只读属性不可修改

Interface 函数

Interface 还可以用来规范函数的形状。

Interface 里面需要列出参数列表返回值类型的函数定义,如下步骤:

  1. 定义了一个函数接口
  2. 接口接收三个参数并且不返回任何值
  3. 使用函数表达式来定义这种形状的函数
// 按上面步骤规定"形状"
interface Func {
    // 定于这个函数接收两个必选参数都是 number 类型,以及一个可选的字符串参数 desc,
    // 另外这个函数不返回任何值
    (x: number, y: number, desc?: string): void
}

// 正确示例
const sum: Func = function (x, y, desc = '') {
    // const sum: Func = function (x: number, y: number, desc: string): void {
    // ts类型系统默认推论可以不必书写上述类型定义👆
    console.log(desc, x + y)
}

// 测试调用
sum(32, 22)

Interface 可索引类型

这种 Interface 描述了索引类型的形状,规定索引返回的值的类型,如下代码所示:

interface StringSet {
    readonly [index: number]: string // ❗ 需要注意的是 index 只能为 number 类型或 string 类型
    length: number // ✔️ 还可以指定属性
}

let arr1: StringSet = ['hello', 'world']
arr1[1] = '' // ✔️ 可以设置为只读防止给索引赋值
let arr: StringSet = [23,12,3,21] // ❌ 数组应为 string 类型

Interface 类

Interface 也可以用来定义一个类的形状。

需要注意的是类 Interface 只会检查实例的属性,静态属性是需要额外定义一个 Interface,如下代码所示:

// 🥇 PersonConstructor 是用来检查静态部分的
interface PersonConstructor {
    new (name: string, age: number) // ✔️ 这个是用来检查 constructor 的
    typename: string // ✔️ 这个是用来检查静态属性 typename 的
    logname(): void // ✔️ 这个用来检查静态方法 logname 的
}
// 🥈 PersonInterface 则是用来检查实例部分的
interface PersonInterface {
    // new (name: string, age: number) // ❌ 静态方法的检查也不能写在这里 这样写是错误的
    log(): void // : 这里定义了实例方法 log
}

// class Person implements PersonInterface, PersonInterface { ❌ 这样写是错误的
const Person: PersonConstructor = class Person implements PersonInterface {
    name: string
    age: number
    static typename = 'Person type' // 这里定义了一个名为 typename 的静态属性
    static logname() { // 这里定义了一个名为 logname 的静态方法
        console.log(this.typename)
    }
    constructor(name: string, age: number) { // constructor 也是静态方法
        this.name = name
        this.age = age
    }
    log() { // log 是实例方法
        console.log(this.name, this.age)
    }
}

Interface 的继承

跟 class 一样,使用 extens 继承,更新新的形状。

比方说继承接口并生成新的接口,这个新的接口可以设定一个新的方法检查,如下代码所示:

interface PersonInfoInterface { // 1️⃣ 这里是第一个接口
    name: string
    age: number
    log?(): void
}

interface Student extends PersonInfoInterface { // 2️⃣ 这里继承了一个接口
    doHomework(): boolean // ✔️ 新增一个方法检查
}
interface Teacher extends PersonInfoInterface { // 3️⃣ 这里又继承了一个接口
    dispatchHomework(): void // ✔️ 新增了一个方法检查
}

// interface Emmm extends Student, Teacher // 也可以继承多个接口

let Alice: Teacher = {
    name: 'Alice',
    age: 34,
    dispatchHomework() { // ✔️ 必须满足继承的接口规范
        console.log('dispatched')
    }
}

let oliver: Student = {
    name: 'oliver',
    age: 12,
    log() {
        console.log(this.name, this.age)
    },
    doHomework() { // ✔️ 必须满足继承的接口规范
        return true
    }
}

混合类型的 Interface

混合类型的接口,就是使用同一个 Interface 来描述函数或者对象的属性或方法。

比如一个函数接收什么参数,输出什么结果,同时这个函数有另外什么方法或属性之类的,如下代码所示:

interface Counter {
    (start: number): void // 1️⃣ 如果只有这一个那么这个接口是函数接口
    add(): void // 2️⃣ 这里还有一个方法,那么这个接口就是混合接口
    log(): number // 3️⃣ 这里还有另一个方法
}

function getCounter(): Counter { // ⚠️ 它返回的函数必须符合接口的三点
    let count = 0
    function counter (start: number) { count = start } // counter 方法函数
    counter.add = function() { count++ } // add 方法增加 count
    counter.log = function() { return count } // log 方法打印 count
    return counter
}

const c = getCounter()
c(10) // count 默认为 10
c.add()
console.log(c.log())

继承类的 Interface

Interface 不仅能够继承 Interface 还能够继承类,再创建子类的过程中满足接口的描述就会必然满足接口继承的类的描述。

class Person {
    type: string // ❗️这里是类的描述
}

interface Child extends Person { // ❗️Child 接口继承自 Person 类,因此规范了 type 属性
    log(): void
    // 这里其实有一个 type: string
}

// ⚠️ 上面的 Child 接口继承了 Person 对 type 的描述,还定义了 Child 接口本身 log 的描述

// 🥇 第一种写法
class Girl implements Child {
    type: 'child' // 接口继承自 Person 的
    log() {} // 接口本身规范的
}

// 🥈 第二种写法
class Boy extends Person implements Child { // 首先 extends 了 Person 类,然后还需满足 Child 接口的描述
    type: 'child'
    log() {}
}

这个接口的定义和使用,如下图所示:

在这里插入图片描述

SEO

typescript的interface, ts interface 关键字详解,TypeScript 接口 interface 小白教程,Typescript 之 interface,TypeScript 接口 interface 使用详解,typeScript 核心基础之接口interface,TypeScript Interfaces,TypeScript中正确使用interface,前端的(typeScript)interface详解,TS里interface,ts里 这个interface表示什么意思,ts interface是什么东西,Typescript - interface 关键字(通俗易懂的详细教程)。

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

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

相关文章

MySQL慢查询分析和性能优化

1 背景我们的业务服务随着功能规模扩大&#xff0c;用户量扩增&#xff0c;流量的不断的增长&#xff0c;经常会遇到一个问题&#xff0c;就是数据存储服务响应变慢。导致数据库服务变慢的诱因很多&#xff0c;而RD最重要的工作之一就是找到问题并解决问题。下面以MySQL为例子&…

矢量网络分析仪介绍

矢量网络分析仪VNA是一种测试仪器&#xff0c;它可以将网络的响应测量成矢量:实参数和虚参数&#xff0c;从而表征其性能。矢量网络分析仪VNA是射频设计实验室和许多制造和服务领域的重要测试仪器。虽然矢量网络分析仪主要侧重于研究和开发&#xff0c;但它也可以为所有类型的R…

想要精通算法和SQL的成长之路 - 柱状图中最大的矩形

想要精通算法和SQL的成长之路 - 柱状图中最大的矩形前言一. 柱状图中最大的矩形前言 想要精通算法和SQL的成长之路 - 系列导航 一. 柱状图中最大的矩形 原题链接 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求…

你是真的“C”——操作符详解【下篇】+整形提升+算术转换

你是真的“C”——操作符详解下篇&#x1f60e;前言&#x1f64c;操作符详解【上篇】内容&#xff1a;操作符详解【下篇】内容&#xff1a;1、 条件操作符2、逗号表达式&#xff1a;3、下标引用、函数调用和结构成员3、访问一个结构的成员表达式求值1、隐式类型转换&#xff1a…

扫雷——C语言【详解+全部码源】

前言&#xff1a;今天我们学习的是C语言中另一个比较熟知的小游戏——扫雷 下面开始我们的学习吧&#xff01; 文章目录游戏整体思路游戏流程游戏菜单的打印创建数组并初始化布置雷排查雷完整代码game.hgame.ctest.c游戏整体思路 我们先来看一下网上的扫雷游戏怎么玩 需要打印…

Imported target “dart“ includes non-existent path 笔记

详细问题&#xff1a;关联功能包&#xff0c;源码编译Failed <<< gazebo_ros2_control [11.8s, exited with code 1]网上查了很多资料&#xff0c;都是比较旧版&#xff0c;这里注意由于ROS2系统发展很快&#xff0c;功能包在快速集成。使用源码编译可能会遇到环境配置…

PMP报考条件?

PMP已经被认为是项目管理专业身份的象征&#xff0c;项目经理人取得的重要资质。 PMP考试一般每年在中国大陆地区&#xff0c;会进行四次考试&#xff0c;今天就来详细说一说PMP考试的时间线。 01考试时间PMP考试在中国大陆一年开展四次&#xff0c;分别在每年的3月、6月、9月…

SpringCloud(17):Sentinel简介

1 流量控制&熔断降级介绍 1.1 流量控制简介 拿旅游景点举个示例&#xff0c;每个旅游景点通常都会有最大的接待量&#xff0c;不可能无限制的放游客进入&#xff0c;比如故宫每天只卖八万张票&#xff0c;超过八万的游客&#xff0c;无法买票进入&#xff0c;因为如果超过…

软件架构设计(二)——领域架构、基于架构的软件开发方法

目录 一、架构描述语言 ADL 二、特定领域软件架构 DSSA 三、DSSA的三层次架构模型 . 四、基于架构的软件开发方法 (1)基于架构的软件设计(ABSD) (2)开发过程 一、架构描述语言 ADL ADL是一种形式化语言&#xff0c;它在底层语义模型的支持下&#xff0c;为软件系统概念体…

云安全之浅谈密钥泄露

前言 如今越来越多公司选择使用云平台&#xff0c;诸如:阿里云、腾讯云、AWS、Azure。使用云平台大大降低了企业的资源成本&#xff0c;另一方面随着公用云的普及&#xff0c;也存在着一些风险。现代应用程序需要与其他外部应用程序通信&#xff0c;并且它们需要内部服务到服务…

ESP32设备驱动-模拟输入(ADC)

模拟输入(ADC) 文章目录 模拟输入(ADC)1、ADC介绍2、ADC相关API介绍3、软件准备4、硬件准备5、代码实现本文将介绍如何使用Arduino IDE对ESP32进行模拟读取。模拟读数可用于从可变电阻式电位计或模拟传感器读取值。 1、ADC介绍 ESP32有两个ADC单元,可用于以下场景: 生成…

Echarts的Category轴滑动

Echarts的Category轴滑动 效果&#xff0c;滚轮上下可拖动 配置项 dataZoom: [// {// // disabled: false,// start: 100, //默认为0// end: 80, //默认为100// // startValue: [xArr.length - 1],// // endValue: [xArr.length - 4],// type: slide…

typora每次复制文档都要附带图片文件夹?学会配置gitee图床

0. 引言 作为开发人员&#xff0c;我们习惯使用md格式来编写文档&#xff0c;特别是typora编辑器更是日常使用的软件。但作为轻量化的文档编辑器&#xff0c;我们在默认插入图片时&#xff0c;一般typora会将图片保存到本地或者引用一个本地图片的路径 当文档还在我们本地打开…

免费IB学习资源推荐,学霸常用

看了那些学霸们分享的笔记与网站&#xff0c;深刻认识到学习的竞争&#xff0c;就是对个人资源归纳整理能力的比拼&#xff0c;想要学好IB学科&#xff0c;除了跟着自己的辅导老师积极学习以外&#xff0c;还要学会充分掌握学习资料&#xff0c;这样才能做到心中有数&#xff0…

超清遥感影像语义分割处理

分割出城市中的垃圾堆场,遂寻找到了 UrbanAtlas 2012 database 这个数据集和对应的 baseline baseline IoU for class 1: 0.5667 IoU for class 2: 0.3504 IoU for class 3: 0.0001 IoU for class 4: 0.0002 IoU for class 5: 0.4121 IoU for class 6: 0.0204 IoU for cla…

第三章:IP地址加掩码讲解和ping命令运用

IP地址加掩码&#xff1a;我打几个IP地址给你们瞅瞅。10.20.70.55/24192.168.30.2/24我写的这几个都是24位掩码的&#xff0c;/后面的是掩码位数&#xff0c;也就是是255.255.255.0。子网掩码分为三类&#xff1a;A类&#xff1a;255.0.0.0B类&#xff1a;255.255.0.0C类&#…

RMIserver端和Registry端源码分析

想学JDNI&#xff0c;那想必一定躲不过RMI。 RMI简述 RMI可以远程调用JVM对象并获取结果。所以需要一个server和一个client进行通信。 Server端会创建一个远程对象用于client端远程访问。 下面改造一张来自W3Cschool的图&#xff1a; 只需要知道&#xff1a;Client端使用st…

UE5 UI材质特效

一、扩散的光圈。效果如下&#xff1a;用ps拉一个 对称渐变 和 径向渐变对称渐变&#xff1a;用于做纹理&#xff0c;通过平面坐标到极坐标的公式&#xff0c;转换成环。径向渐变&#xff1a;用于Mask将贴图的纹理组改为 UI&#xff0c;压缩设置改为 用户界面2D。创建材质 M_Te…

Myb atis基础3

Mybatis注解开发单表操作Mybatis的常用注解Mybatis的增删改查MyBatis注解开发的多表操作MyBatis的注解实现复杂映射开发一对一查询一对多查询多对多查询构建sqlsql构建对象介绍查询功能的实现新增功能的实现修改功能的实现删除功能的实现Mybatis注解开发单表操作 Mybatis的常用…

【运筹优化】Python 实现标签算法求解 ESPPRC 问题

文章目录一、标签算法介绍二、SPPRC 问题三、ESPPRC 问题四、Python 实现标签算法求解 ESPPRC 问题4.1 Solomn 数据集4.2 完整代码4.2.1 Functions.py4.2.2 LabelAlgo.py4.2.3 Main.py4.3 结果展示4.3.1 测试案例&#xff1a;c101.txt4.3.2 测试案例&#xff1a;r101.txt一、标…