news 2026/6/20 17:19:42

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Typescript - interface 关键字(通俗易懂的详细教程)

前言

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

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

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

Interface 对象

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

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

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

// 按上面步骤规定"形状"interfacePerson{name:stringbool?:booleanreadonlytimestamp:numberreadonlyarr:ReadonlyArray<number>// 此外还有 ReadonlyMap/ReadonlySet}// 正确示例letp1:Person={name:'oliver',bool:true,// ✔️️ 可以设置可选属性 并非必要的 可写可不写timestamp:+newDate(),// ✔️ 设置只读属性arr:[1,2,3]// ✔️ 设置只读数组}// 错误示例letp:Person={age:'oliver',// ❌ 多出来的属性name:123// ❌ 类型错误}// 错误示例p1.timestamp=123// ❌ 只读属性不可修改p1.arr.pop()// ❌ 只读属性不可修改

Interface 函数

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

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

  1. 定义了一个函数接口
  2. 接口接收三个参数并且不返回任何值
  3. 使用函数表达式来定义这种形状的函数
// 按上面步骤规定"形状"interfaceFunc{// 定于这个函数接收两个必选参数都是 number 类型,以及一个可选的字符串参数 desc,// 另外这个函数不返回任何值(x:number,y:number,desc?:string):void}// 正确示例constsum: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 描述了索引类型的形状,规定索引返回的值的类型,如下代码所示:

interfaceStringSet{readonly[index:number]:string// ❗ 需要注意的是 index 只能为 number 类型或 string 类型length:number// ✔️ 还可以指定属性}letarr1:StringSet=['hello','world']arr1[1]=''// ✔️ 可以设置为只读防止给索引赋值letarr:StringSet=[23,12,3,21]// ❌ 数组应为 string 类型

Interface 类

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

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

// 🥇 PersonConstructor 是用来检查静态部分的interfacePersonConstructor{new(name:string,age:number)// ✔️ 这个是用来检查 constructor 的typename:string// ✔️ 这个是用来检查静态属性 typename 的logname():void// ✔️ 这个用来检查静态方法 logname 的}// 🥈 PersonInterface 则是用来检查实例部分的interfacePersonInterface{// new (name: string, age: number) // ❌ 静态方法的检查也不能写在这里 这样写是错误的log():void// : 这里定义了实例方法 log}// class Person implements PersonInterface, PersonInterface { ❌ 这样写是错误的constPerson:PersonConstructor=classPersonimplementsPersonInterface{name:stringage:numberstatictypename='Person type'// 这里定义了一个名为 typename 的静态属性staticlogname(){// 这里定义了一个名为 logname 的静态方法console.log(this.typename)}constructor(name:string,age:number){// constructor 也是静态方法this.name=namethis.age=age}log(){// log 是实例方法console.log(this.name,this.age)}}

Interface 的继承

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

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

interfacePersonInfoInterface{// 1️⃣ 这里是第一个接口name:stringage:numberlog?():void}interfaceStudentextendsPersonInfoInterface{// 2️⃣ 这里继承了一个接口doHomework():boolean// ✔️ 新增一个方法检查}interfaceTeacherextendsPersonInfoInterface{// 3️⃣ 这里又继承了一个接口dispatchHomework():void// ✔️ 新增了一个方法检查}// interface Emmm extends Student, Teacher // 也可以继承多个接口letAlice:Teacher={name:'Alice',age:34,dispatchHomework(){// ✔️ 必须满足继承的接口规范console.log('dispatched')}}letoliver:Student={name:'oliver',age:12,log(){console.log(this.name,this.age)},doHomework(){// ✔️ 必须满足继承的接口规范returntrue}}

混合类型的 Interface

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

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

interfaceCounter{(start:number):void// 1️⃣ 如果只有这一个那么这个接口是函数接口add():void// 2️⃣ 这里还有一个方法,那么这个接口就是混合接口log():number// 3️⃣ 这里还有另一个方法}functiongetCounter():Counter{// ⚠️ 它返回的函数必须符合接口的三点letcount=0functioncounter(start:number){count=start}// counter 方法函数counter.add=function(){count++}// add 方法增加 countcounter.log=function(){returncount}// log 方法打印 countreturncounter}constc=getCounter()c(10)// count 默认为 10c.add()console.log(c.log())

继承类的 Interface

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

classPerson{type:string// ❗️这里是类的描述}interfaceChildextendsPerson{// ❗️Child 接口继承自 Person 类,因此规范了 type 属性log():void// 这里其实有一个 type: string}// ⚠️ 上面的 Child 接口继承了 Person 对 type 的描述,还定义了 Child 接口本身 log 的描述// 🥇 第一种写法classGirlimplementsChild{type:'child'// 接口继承自 Person 的log(){}// 接口本身规范的}// 🥈 第二种写法classBoyextendsPersonimplementsChild{// 首先 extends 了 Person 类,然后还需满足 Child 接口的描述type:'child'log(){}}

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 2:49:12

python_django基于微信小程序的移动医院挂号预约系统

文章目录 系统概述技术架构核心功能创新点应用价值 系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 基于微信小程序的移动医院挂号预约系统采用PythonDjango框架开发后端服务&#xff0…

作者头像 李华
网站建设 2026/6/19 2:50:15

python_django安卓企业直播内容管理系统小程序

文章目录技术架构概述核心功能模块数据流与安全性能优化策略扩展性设计系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;技术架构概述 Python Django 作为后端框架&#xff0c;提供 RESTful API 接…

作者头像 李华
网站建设 2026/6/18 16:29:44

基于Impress.js的智能多面棱柱演示器:技术与创意深度解析

第一章&#xff1a;引言与项目背景1.1 Web 3D交互的发展历程在当今快速发展的Web技术领域&#xff0c;3D交互体验已成为提升用户参与度和沉浸感的关键因素。从早期的Flash动画到如今的WebGL和CSS 3D变换&#xff0c;Web三维技术已经走过了漫长的发展道路。根据最新统计数据&…

作者头像 李华
网站建设 2026/6/15 16:53:09

程序员必学!企业级大模型落地全攻略:6-12个月实现AI转型的关键路径

企业级大模型作为突破性技术&#xff0c;能显著提升生产力并驱动业务创新。企业实施周期已缩短至6-12个月&#xff0c;47%的企业认为与领先厂商合作是成功关键。选择服务商时应注重全栈开发能力、丰富工具及垂直场景经验。成功标志不在于部署多少模型&#xff0c;而在于建立持续…

作者头像 李华
网站建设 2026/6/13 17:18:23

【机械臂路径规划】基于 RRT算法的3自由度机械臂路径规划器,在存在圆形障碍物的环境中,为机械臂找到一条从初始关节角度到目标关节角度的无碰撞路径附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

作者头像 李华