首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ArkTS基础语法--接口

ArkTS基础语法--接口

原创
作者头像
IT蜗壳-Tango
发布于 2024-05-05 12:59:41
发布于 2024-05-05 12:59:41
63200
代码可运行
举报
运行总次数:0
代码可运行

接口

接口声明引入新类型。接口是定义代码协定的常见方式。

任何一个类的实例只要实现了特定接口,就可以通过该接口实现多态。

接口通常包含属性和方法的声明

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Style {  color: string // 属性}interface AreaSize {  calculateAreaSize(): number // 方法的声明  someMethod(): void;     // 方法的声明}

实现接口的类示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 接口:interface AreaSize {  calculateAreaSize(): number // 方法的声明  someMethod(): void;     // 方法的声明}
// 实现:class RectangleSize implements AreaSize {  private width: number = 0  private height: number = 0  someMethod(): void {    console.log('someMethod called');  }  calculateAreaSize(): number {    this.someMethod(); // 调用另一个方法并返回结果    return this.width * this.height;  }}

接口属性

接口属性可以是字段、getter、setter或getter和setter组合的形式。

属性字段只是getter/setter对的便捷写法。以下表达方式是等价的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Style {  color: string}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Style {  get color(): string  set color(x: string)}

实现接口的类也可以使用以下两种方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Style {  color: string}
class StyledRectangle implements Style {  color: string = ''}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Style {  color: string}
class StyledRectangle implements Style {  private _color: string = ''  get color(): string { return this._color; }  set color(x: string) { this._color = x; }}

接口继承

接口可以继承其他接口,如下面的示例所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Style {  color: string}
interface ExtendedStyle extends Style {  width: number}

继承接口包含被继承接口的所有属性和方法,还可以添加自己的属性和方法。

泛型类型和函数

泛型类型和函数允许创建的代码在各种类型上运行,而不仅支持单一类型。

泛型类和接口

类和接口可以定义为泛型,将参数添加到类型定义中,如以下示例中的类型参数Element:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CustomStack<Element> {  public push(e: Element):void {    // ...  }}

要使用类型CustomStack,必须为每个类型参数指定类型实参:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let s = new CustomStack<string>();s.push('hello');

编译器在使用泛型类型和函数时会确保类型安全。参见以下示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let s = new CustomStack<string>();s.push(55); // 将会产生编译时错误

泛型约束

泛型类型的类型参数可以绑定。例如,HashMap<Key, Value>容器中的Key类型参数必须具有哈希方法,即它应该是可哈希的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Hashable {  hash(): number}class HasMap<Key extends Hashable, Value> {  public set(k: Key, v: Value) {    let h = k.hash();    // ...其他代码...  }}

在上面的例子中,Key类型扩展了Hashable,Hashable接口的所有方法都可以为key调用。

泛型函数

使用泛型函数可编写更通用的代码。比如返回数组最后一个元素的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function last(x: number[]): number {  return x[x.length - 1];}last([1, 2, 3]); // 3

如果需要为任何数组定义相同的函数,使用类型参数将该函数定义为泛型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function last<T>(x: T[]): T {  return x[x.length - 1];}

现在,该函数可以与任何数组一起使用。

在函数调用中,类型实参可以显式或隐式设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 显式设置的类型实参last<string>(['aa', 'bb']);last<number>([1, 2, 3]);
// 隐式设置的类型实参// 编译器根据调用参数的类型来确定类型实参last([1, 2, 3]);

泛型默认值

泛型类型的类型参数可以设置默认值。这样可以不指定实际的类型实参,而只使用泛型类型名称。下面的示例展示了类和函数的这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SomeType {}interface Interface <T1 = SomeType> { }class Base <T2 = SomeType> { }class Derived1 extends Base implements Interface { }// Derived1在语义上等价于Derived2class Derived2 extends Base<SomeType> implements Interface<SomeType> { }
function foo<T = number>(): T {  // ...}foo();// 此函数在语义上等价于下面的调用foo<number>();

空安全

默认情况下,ArkTS中的所有类型都是不可为空的,因此类型的值不能为空。这类似于TypeScript的严格空值检查模式(strictNullChecks),但规则更严格。

在下面的示例中,所有行都会导致编译时错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let x: number = null;    // 编译时错误let y: string = null;    // 编译时错误let z: number[] = null;  // 编译时错误

可以为空值的变量定义为联合类型T | null。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let x: number | null = null;x = 1;    // okx = null; // okif (x != null) { /* do something */ }

非空断言运算符

后缀运算符!可用于断言其操作数为非空。

应用于空值时,运算符将抛出错误。否则,值的类型将从T | null更改为T:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class C {  value: number | null = 1;}
let c = new C();let y: number;y = c.value + 1;  // 编译时错误:无法对可空值作做加法y = c.value! + 1; // ok,值为2

空值合并运算符

空值合并二元运算符??用于检查左侧表达式的求值是否等于null或者undefined。如果是,则表达式的结果为右侧表达式;否则,结果为左侧表达式。

换句话说,a ?? b等价于三元运算符(a != null && a != undefined) ? a : b。

在以下示例中,getNick方法如果设置了昵称,则返回昵称;否则,返回空字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person {  // ...  nick: string | null = null  getNick(): string {    return this.nick ?? '';  }}

可选链

在访问对象属性时,如果该属性是undefined或者null,可选链运算符会返回undefined。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person {  nick: string | null = null  spouse?: Person
  setSpouse(spouse: Person): void {    this.spouse = spouse;  }
  getSpouseNick(): string | null | undefined {    return this.spouse?.nick;  }
  constructor(nick: string) {    this.nick = nick;    this.spouse = undefined;  }}

说明:getSpouseNick的返回类型必须为string | null | undefined,因为该方法可能返回null或者undefined。

可选链可以任意长,可以包含任意数量的?.运算符。

在以下示例中,如果一个Person的实例有不为空的spouse属性,且spouse有不为空的nickname属性,则输出spouse.nick。否则,输出undefined:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person {  nick: string | null = null  spouse?: Person
  constructor(nick: string) {    this.nick = nick;    this.spouse = undefined;  }}
let p: Person = new Person('Alice');p.spouse?.nick; // undefined

---

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Vue电商实践项目(二)
1.实现后台首页的基本布局 2.实现左侧菜单栏 3.实现用户列表展示 4.实现添加用户
用户6808043
2022/02/24
5.2K0
基于Vue和SpringBoot的电商管理系统的设计与实现
随着社会经济的高速增长,科技的日新月异,特别是进入数字化社会以来,快节奏已是生活的常态。人们开始追求高效、便捷的方式来满足日常生活需求。随即网上购物就愈发活跃,就连老年人也打破传统的采买方式开始尝试线上购物。此时商家便需要一个后台管理系统对订单进行系统的管理。
Designer 小郑
2023/08/01
3.9K0
基于Vue和SpringBoot的电商管理系统的设计与实现
前端成神之路-vue前端项目06
使用upload组件完成图片上传 在element.js中引入upload组件,并注册 因为upload组件进行图片上传的时候并不是使用axios发送请求 所以,我们需要手动为上传图片的请求添加token,即为upload组件添加headers属性
海仔
2021/05/06
1.9K0
【开源毕设】前后端分离,基于 Vue 和 SpringBoot 的假日旅社管理系统
本软件是《基于 Vue 和 SpringBoot 的假日旅社管理系统》,支持民宿档案、民宿新闻、民宿预定、民宿评论这四大核心业务,适用于乡村民宿企业的民宿预定业务。系统给每个民宿档案提供一个唯一标识,对民宿预定、评论等各个环节进行快速批量的数据采集,确保游客及时掌握景区民宿的真实数据,方便游客进行民宿预定。另外系统还包括员工管理、组织机构管理、文件管理、权限管理功能,给旅社企业提供更个性化的民宿管理模式。
Designer 小郑
2023/08/01
6460
【开源毕设】前后端分离,基于 Vue 和 SpringBoot 的假日旅社管理系统
MyEMS 能源管理系统后台配置 - 配电系统管理​
在数字化与智能化的浪潮下,能源管理已成为企业降本增效、实现可持续发展的关键环节。MyEMS 能源管理系统凭借其强大的功能体系,精准对接企业对能源管理的多元需求。系统通过对主要能耗设备、用能单位的能源利用现状进行全方位监测与深度分析,综合运用统计分析方法、能源审计方法和能量平衡方法等专业手段,定期对企业能耗状况及其费用进行精细化剖析,不仅能够帮助企业构建科学完善的能耗与节能指标体系,还能深度挖掘节能潜力,为企业量身定制切实可行的节能方案。接下来,将详细介绍系统中配电系统管理的核心功能与操作流程。​
开源能源管理系统
2025/06/24
980
MyEMS 能源管理系统后台配置 - 配电系统管理​
基于Vue的电商后台管理系统(2)
上期已经实现该系统的登陆界面、路由、登录、退出及导航守卫功能,本期将继续完善该系统的以下功能:从后端获取后台列表数据并渲染到前端页面、用户列表的展示、修改、删除和添加。
全栈程序员站长
2022/06/30
1.2K0
基于Vue的电商后台管理系统(2)
前端成神之路-vue前端项目05
1.完成参数管理 2.推送代码到码云 3.制作商品列表页面 4.制作商品添加页面
海仔
2021/05/06
1.5K0
前端成神之路-vue前端项目02
1.实现后台首页的基本布局 2.实现左侧菜单栏 3.实现用户列表展示 4.实现添加用户
海仔
2021/03/20
4.2K0
【毕设】基于springboot+vue的在线考试报名系统
随着社会的进步和商品经济的不断发展,社会对劳动者和技术人员的知识和能力水平的要求越来越高。考试作为衡量人的能力的重要手段,在现代生活的地位进一步提高,并深入到社会各个方面,各种各样的学历考试、资格证书考试层出不穷。同时,Internet技术的发展是得考试的技术手段和载体发生了革命性的变化。Internet 的开放性和分布性的特点以及基于Internet 的巨大计算能力使得考试突破了时间和空间的限制。网络应用不断扩大,如远程教育和虚拟大学的出现等;使得基于Web的在线考试系统成为现实。基于Web的在线考试系统可以发挥网络的优势,建立大型、高效、共享的题库和实现随时随地的考试,降低考试成本,减少人为的干扰。减轻教师的负担,节约人力,物力,和财力。
MIKE笔记
2024/04/22
4510
【毕设】基于springboot+vue的在线考试报名系统
MyEMS 能源管理系统后台配置 - 传感器管理操作指南​
MyEMS 开源能源管理系统凭借其强大且全面的功能,广泛适用于建筑、工厂、商场、医院、园区等多种场景,能够对电、水、气等各类能源数据进行高效采集、深入分析并生成详细报表。同时,系统还提供了诸如光伏、储能、充电桩、微电网、设备控制、故障诊断、工单管理、人工智能优化等丰富的可选功能,全方位满足企业在能源管理方面的多元需求。通过对主要能耗设备和用能单位的能源利用现状进行实时监测与深入分析,运用统计分析、能源审计和能量平衡等科学方法,定期剖析企业能耗状况及其费用支出,帮助企业精准确定能耗与节能指标体系,深度挖掘节能潜力并制定切实可行的节能措施。接下来,将详细介绍 MyEMS 能源管理系统后台配置中的传感器管理相关操作。
开源能源管理系统
2025/06/19
760
MyEMS 能源管理系统后台配置 - 传感器管理操作指南​
MyEMS 开源能源管理系统操作说明与产品介绍​-成本中心管理
MyEMS 开源能源管理系统是一款具备前沿技术与卓越性能的综合管理平台,广泛适用于建筑、工厂、商场、医院、园区等各类场景。在能源数据管理层面,它能够精准、高效地采集电、水、气等多种能源数据,借助先进的数据分析算法,对采集到的数据进行深度挖掘与分析,从而生成精准、直观的报表,帮助用户清晰掌握能源使用状况。​
开源能源管理系统
2025/06/16
1380
前端成神之路-vue前端项目04
新建分支goods_cate并推送到码云 git checkout -b goods_cate git push -u origin goods_cate
海仔
2021/05/06
1.8K0
微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现
先来看看今天的整体思路: 进入分组管理页面-->点击新建分组新建 进入到未分组页面基本操作 进入到已建分组里面底部菜单栏操作-->从名片夹中添加进行操作。 理清完基本流程我们开始开发。首先整个布局可以
ytkah
2018/03/06
2.1K0
微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现
MyEMS 能源管理系统后台配置 - 用户与权限详解​
在 MyEMS 能源管理系统中,合理的用户与权限配置是保障系统安全、高效运行的关键。通过精细的用户管理与权限分配,既能确保数据安全,又能提升不同角色用户的操作便捷性。接下来,我们将详细介绍用户与权限模块的各项功能及操作流程。​
开源能源管理系统
2025/07/04
800
MyEMS 能源管理系统后台配置 - 用户与权限详解​
前端成神之路-vue前端项目03
A.为用户列表中的修改按钮绑定点击事件 B.在页面中添加修改用户对话框,并修改对话框的属性 C.根据id查询需要修改的用户数据
海仔
2021/05/06
1.9K0
MyEMS 开源能源管理系统后台配置 - 组合设备管理​
MyEMS 开源能源管理系统是一款功能强大且应用广泛的能源管理工具,它适用于建筑、工厂、商场、医院、园区等各类场景,能够实现对电、水、气等多种能源的数据采集、深度分析与专业报表生成。此外,系统还提供了光伏、储能、充电桩、微电网等新能源管理模块,以及设备控制、故障诊断、工单管理、人工智能优化等一系列可选功能,全方位满足不同用户的多样化需求。凭借资深专业团队的持续开发与维护,系统可提供长期稳定的支持,以开源的模式助力企业集团、产业园区、能源运营商实现低碳可持续发展。​
开源能源管理系统
2025/06/19
800
MyEMS 开源能源管理系统后台配置 - 组合设备管理​
从小程序游戏开放可以看出,微信已经开始转移小程序战场了
继两天前的小程序直播功能开放后,昨天小程序又释放了一波令人惊叹的功能: 在微信对话框首页,下拉即可唤出小程序任务栏; 小程序菜单升级,右上角在原本“···”的基础上新增“圆点”按钮,可用于快速离开当前小程序,无需按步骤返回; 小程序支持小游戏开发。 以上功能均需要将微信更新到6.6.1版本才可以使用。 3大新能力怎么玩? 1、下拉唤出小程序任务栏 在微信6.6.1版本中,只要下拉页面即可唤出小程序任务栏。这里会显示你历史使用过的小程序,并且可以左右滑动,在最右侧放置“···”按钮,点击即可跳转至「小程序
企鹅号小编
2018/01/15
1.2K0
从小程序游戏开放可以看出,微信已经开始转移小程序战场了
MyEMS 能源管理系统后台配置 - SVG(企业版)
在 MyEMS 能源管理系统的企业版中,可缩放矢量图形(Scalable Vector Graphics, SVG)扮演着至关重要的角色。它作为一种基于 XML 标记语言的格式,能够精准地描述二维矢量图形,凭借其缩放不失真的特性,成为系统中直观展示能源设备布局、线路连接、能源流动状态等关键信息的重要载体。通过 SVG 图形,用户可以更清晰、便捷地掌握企业能源系统的整体架构和实时运行情况,为能源监控、分析和管理决策提供有力支持。​
开源能源管理系统
2025/07/11
690
MyEMS 能源管理系统后台配置 - SVG(企业版)
【开发模板】Vue和SpringBoot的前后端分离开发模板
本软件是基于 Vue 和 SpringBoot 的通用管理系统,包含了登陆注册、用户管理、部门管理、文件管理、权限管理、日志管理、个人中心、数据字典和代码生成这九个功能模块,另外还有两张样例数据表和五张样例数据图,是一个很好的前后端分离开发模板,开发者可以在这个模板上进行二次开发,只需要实现需求方的业务逻辑,即可快速成型甲方的业务需求。
Designer 小郑
2023/08/01
6180
【开发模板】Vue和SpringBoot的前后端分离开发模板
毕业设计So Easy:SpringBoot+Vue图书阅读和管理系统(前端+后端+小程序端)
很多计算机专业大学生经常和我交流:毕业设计没思路、不会做、论文不会写、太难了......
不脱发的程序猿
2023/03/14
5510
毕业设计So Easy:SpringBoot+Vue图书阅读和管理系统(前端+后端+小程序端)
推荐阅读
相关推荐
Vue电商实践项目(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档