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

鸿蒙学习(四):泛型空安全模块导入导出

泛型与函数

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

泛型类和接口(Element)

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

class CustomStack<Element> {public push(e: Element):void {// ...}
}

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

let s = new CustomStack<string>();

编译器在使用泛型类型和函数时会确保类型安全。

泛型约束

泛型类型的类型参数可以被限制只能取某些特定的值。例如,MyHashMap<Key, Value>这个类中的Key类型参数必须具有hash方法。
例如:

interface Hashable {hash(): number
}
class MyHashMap<Key extends Hashable, Value> {public set(k: Key, v: Value) {let h = k.hash();// ...其他代码...}
}

泛型函数(T)

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

function last<T>(x: T[]): T {return x[x.length - 1];
}// 显式设置的类型实参
last<string>(['aa', 'bb']);
last<number>([1, 2, 3]);// 隐式设置的类型实参
// 编译器根据调用参数的类型来确定类型实参
last([1, 2, 3]);

泛型默认值

泛型类型的类型参数可以设置默认值。这样可以不指定实际的类型实参,而只使用泛型类型名称。

空安全

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

let x: number = null;    // 编译时错误
let y: string = null;    // 编译时错误
let z: number[] = null;  // 编译时错误

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

let x: number | null = null;
x = 1;    // ok
x = null; // ok
if (x != null) { /* do something */ }

非空断言运算符——后置!

后缀运算符!可用于断言其操作数为非空。
==应用于可空类型的值时,它的编译时类型变为非空类型。==例如,类型将从T | null更改为T:

class A {value: number = 0;
}function foo(a: A | null) {a.value;   // 编译时错误:无法访问可空值的属性a!.value;  // 编译通过,如果运行时a的值非空,可以访问到a的属性;如果运行时a的值为空,则发生运行时异常
}

空值合并运算符——??

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

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

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

class Person {// ...nick: string | null = nullgetNick(): string {return this.nick ?? '';}
}

可选链——后置?

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

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

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

class Person {nick: string | null = nullspouse?: Personconstructor(nick: string) {this.nick = nick;this.spouse = undefined;}
}let p: Person = new Person('Alice');
p.spouse?.nick; // undefined

模块

程序可划分为多组编译单元或模块。

每个模块都有其自己的作用域,即,在模块中创建的任何声明(变量、函数、类等)在该模块之外都不可见,除非它们被显式导出。

与此相对,从另一个模块导出的变量、函数、类、接口等必须首先导入到模块中。

导出 ——关键字export

可以使用关键字export导出顶层的声明。?????????

未导出的声明名称被视为私有名称,只能在声明该名称的模块中使用。
注意:通过export方式导出,在导入时要加{}。

静态导入

导入声明用于导入从其他模块导出的实体,并在当前模块中提供其绑定。导入声明由两部分组成:

导入路径,用于指定导入的模块;
导入绑定,用于定义导入的模块中的可用实体集和使用形式(限定或不限定使用)。

导入绑定可以有几种形式。

假设模块具有路径“./utils”和导出实体“X”和“Y”。

导入绑定* as A表示绑定名称“A”,通过A.name可访问从导入路径指定的模块导出的所有实体:

import * as Utils from './utils'
Utils.X // 表示来自Utils的X
Utils.Y // 表示来自Utils的Y

导入绑定{ ident1, …, identN }表示将导出的实体与指定名称绑定,该名称可以用作简单名称:

import { X, Y } from './utils'
X // 表示来自utils的X
Y // 表示来自utils的Y

如果标识符列表定义了ident as alias,则实体ident将绑定在名称alias下:

import { X as Z, Y } from './utils'
Z // 表示来自Utils的X
Y // 表示来自Utils的Y
X // 编译时错误:'X'不可见

动态导入

应用开发的有些场景中,如果希望根据条件导入模块或者按需导入模块,可以使用动态导入代替静态导入。
import()语法通常称为动态导入,是一种类似函数的表达式,用来动态导入模块。以这种方式调用,将返回一个promise。

顶层语句

顶层语句是指在模块的最外层直接编写的语句,这些语句不被包裹在任何函数、类、块级作用域中。顶层语句包括变量声明、函数声明、表达式等。

关键字

this

关键字this只能在类的实例方法中使用。
关键字this的指向:

  1. 调用实例方法的对象
  2. 正在构造的对象

相关文章:

鸿蒙学习(四):泛型空安全模块导入导出

泛型与函数 泛型类型和函数允许创建的代码在各种类型上运行&#xff0c;而不仅支持单一类型。 泛型类和接口(Element) 类和接口可以定义为泛型&#xff0c;将参数添加到类型定义中&#xff0c;如以下示例中的类型参数Element&#xff1a; class CustomStack<Element>…...

无人机(Unmanned Aerial Vehicle, UAV)视觉感知论文汇总

综述类 A Survey of Object Detection for UAVs Based on Deep LearningDeep Learning for UAV-based Object Detection and Tracking&#xff1a;A surveyMoving Target Tracking by Unmanned Aerial Vehicle&#xff1a;A Survey and TaxonomyVision-Based Learning for Dro…...

【ORACLE】 ORA-01691: Lob 段无法通过 8192 (在表空间 XXX_SPACE 中) 扩展

ORA-01691错误通常表示Oracle数据库在尝试扩展LOB段时无法为表空间分配更多的空间。这个问题通常由表空间容量不足引起。根据搜索结果&#xff0c;以下是几种可能的解决方案&#xff1a; 检查并扩大表空间&#xff1a;首先&#xff0c;确认表空间是否已经达到其最大容量。可以使…...

Java之静态代理与动态代理的区别

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f525; 微信&#xff1a;zsqtcyw 联系我领取学习资料 …...

公司内网监控软件有哪些?(2024年10款最新款推荐内网监控软件)

在2024年&#xff0c;公司内网监控软件市场提供了多种选择&#xff0c;以满足不同企业的监控需求。 以下是一些值得推荐的最新款内网监控软件&#xff1a; 1. Performance Monitor 核心功能&#xff1a;不仅是一款局域网监控软件&#xff0c;更是一个全面的内网安全管理解决方…...

CUDA编程07 - 卷积的优化

一:概述 在接下来的几篇文章中,我们将讨论一组重要的并行计算模式。这些模式是许多并行算法的基础,这些算法出现在许多并行应用中。我们将从卷积开始,卷积是一种流行的数组操作,广泛应用于信号处理、数字录音、图像处理、视频处理和计算机视觉等领域。在这些应用领域中,卷…...

解锁高效办公新姿势:SSO单点登录+企业网盘完美搭配

在现代互联网环境中&#xff0c;随着企业业务的不断扩展&#xff0c;多系统、多应用的集成成为常态。为了提升用户体验&#xff0c;减少用户在不同系统间切换的繁琐&#xff0c;单点登录&#xff08;SSO, Single Sign-On&#xff09;技术应运而生。 本文将详细介绍SSO单点登录的…...

[数据集][目标检测]竹子甘蔗发芽缺陷检测数据集VOC+YOLO格式2953张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2953 标注数量(xml文件个数)&#xff1a;2953 标注数量(txt文件个数)&#xff1a;2953 标注…...

RTC碰到LXTAL低频晶振停振怎么办?

GD32F303的RTC模块框图如下图所示&#xff0c;RTC时钟源可选择HXTAL/128、LXTAL或IRC40K&#xff0c;一般为了实现更精准的RTC时间&#xff0c;MCU系统均会外挂32.768KHz LXTAL低频晶振&#xff0c;但由于低频晶振负阻抗较大&#xff0c;不容易起振&#xff0c;若外部电路布线、…...

矩阵中的最大得分(Lc3148)——动态规划

给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&#xff09;。从值为 c1 的单元格移动到值为 c2 的单元格的得分为 c2 - c1 。 你可以从 任一 单元格开始&#xff0c;并且必须…...

C++ 设计模式(4. 建造者模式)

建造者模式&#xff08;也被成为生成器模式&#xff09;&#xff0c;是一种创建型设计模式&#xff0c;软件开发过程中有的时候需要创建很复杂的对象&#xff0c;而建造者模式的主要思想是将对象的构建过程分为多个步骤&#xff0c;并为每个步骤定义一个抽象的接口。具体的构建…...

Arbitrum 和 Optimism Layer 2 扩展方案对比

Arbitrum 和 Optimism 对比分析 Arbitrum 和 Optimism 是两个以太坊 Layer 2 扩展方案&#xff0c;它们都使用了 Optimistic Rollup 技术来提升以太坊的可扩展性并降低交易成本。虽然它们有着相似的目标&#xff0c;但在架构设计、性能表现和费用结构上各有特点。 一、架构与…...

热门的蓝牙耳机中,哪种类型更受欢迎?四款热度高的开放式耳机

在如今的耳机市场中&#xff0c;开放式耳机异军突起&#xff0c;成为了众多消费者的新宠。如果你还在为传统入耳式耳机带来的不适而烦恼&#xff0c;那么开放式耳机绝对值得你一试。它不仅能让你在享受音乐的同时&#xff0c;依然可以清晰感知周围环境&#xff0c;保障你的安全…...

基于web的亚热带常见自然林病虫害识别系统——总结与展望

文章目录 一、前言二、总结三、展望参考文献致谢一、前言 这个系列也迎来了结尾,最后说一些碎碎念… 二、总结 本文首先简要介绍了卷积神经网络的基本原理,以及在亚热带常见自然林植物识别领域的研究应用现状。 其重点研究了卷积神经网络在亚热带常见自然林植物叶片病害识…...

其他自动重试的注解

除了 Retryable 注解之外&#xff0c;Spring 提供了其他注解用于自动重试方法&#xff0c;主要包括以下几个注解&#xff1a; 1. Recover Recover 注解用于定义重试次数耗尽后执行的恢复方法。当 Retryable 注解的重试次数达到上限时&#xff0c;Recover 方法会被调用。这通常…...

宠物空气净化器哪款能吸毛?希喂、米家宠物空气净化器测评分享

养猫最令人困扰的&#xff0c;就是掉毛与难以彻底消除的异味&#xff0c;这两个问题就成了养猫生活中的一大挑战。每当换季或是猫咪自我梳理时&#xff0c;家中便被一层细腻的绒毛覆盖&#xff0c;从地板到沙发&#xff0c;从床单到衣物&#xff0c;甚至是空气中都漂浮着细小的…...

讲清前端开发(入门)

前端开发&#xff1a;创建用户在网页或应用程序中直接与之交互的部分。 简单来说&#xff0c;就是负责打造用户在使用网站、网页应用或者移动应用时直接看到和与之交互的部分。打个比方&#xff0c;前端开发就像是给房子做装修。房子的框架结构已经有了&#xff0c;但是需要有…...

深入理解MySQL索引:原理、数据结构与优化策略

深入理解MySQL索引&#xff1a;原理、数据结构与优化策略 MySQL 是当今最流行的开源关系型数据库管理系统之一&#xff0c;其强大的性能与灵活的可扩展性使得它广泛应用于各种规模的应用程序中。在数据库的日常操作中&#xff0c;索引起着至关重要的作用&#xff0c;能够极大地…...

mysql数据库基础使用

1、登录mysql ① 本地登录 mysql -u 用户名 -p ②远程登入 mysql -h ip主机地址 -P 端口号 -u 用户名 -p 回车输入密码即可. 2、关于用户操作 ①创建用户 % 代表所有ip都可以访问&#xff0c;可指定主机ip create user 用户名% identified by 密码; ②修改密码 alte…...

GATK AlleleList接口介绍

在 GATK(Genome Analysis Toolkit)中,AlleleList 接口是一个用来表示等位基因(alleles)列表的接口。Allele 是遗传学中用于表示某一特定基因座的不同形式的一个基本单位。AlleleList 接口定义了一些操作,使得处理和访问一组等位基因更加方便。 AlleleList 的实现类和继承…...

直播App遭受抓包后的DDoS与CC攻击防御策略

随着直播应用的普及&#xff0c;越来越多的用户开始依赖这些平台进行娱乐和社交活动。然而&#xff0c;这也使得直播平台成为网络攻击的目标之一。其中&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击和CC&#xff08;Challenge Collapsar&#xff0c;即HTTP慢速攻…...

【xilinx】 AXI Quad SPI IP - 如果 s_axi_wstrb 不等于 0xf,则寄存器可能无法正确更新

PG153 (v3.2) 规定如下&#xff1a; “AXI4-Lite 写访问寄存器由 32 位 AXI 写数据 (* _wdata ) 信号更新&#xff0c;并且不受 AXI 写数据选通 (* _wstrb ) 信号的影响。” "The AXI4-Lite write access register is updated by the 32-bit AXI Write Data (* _wdata ) s…...

【EPLAN】P8 2.9 使用不了ePLUSE

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决 EPLAN P8 2.9 使用不了ePLUSE问题 2、 问题场景 客户反应 EPLAN P8 2.9 版本打开后使用不了 ePLUSE 功能&#xff0c;如图 1 所示 EPLAN ePLUSE 界面为空白状态&#xff0c;无法使用。 图 1 3、软硬件环境 …...

页面设计任务 个人简介页面

目录 任务要求 任务讲解 源码: 详细讲解 html部分 CSS部分 任务要求 页面结构: 创建一个基本的 HTML 页面&#xff0c;页面标题为“我的个人简介”。页面内容分为以下四个部分&#xff1a; 顶部导航栏: 包含至少三个导航链接&#xff0c;例如&#xff1a;“主页”、“关于…...

机械学习—零基础学习日志(如何理解概率论3)

随机变量的函数分布 一维随机变量分布&#xff0c;可以看到下图&#xff0c;X为不同情况的概率。而x如果是大于等于X&#xff0c;那么当x在40以内时&#xff0c;没有概率&#xff0c;为0。 当x变大&#xff0c;在40-80之间&#xff0c;那么x大于X的概率为&#xff0c;0.7&…...

YOLOv8添加SE注意力机制有效提升检测精度(已跑通)

SE注意力机制概念 SSqueeze-and-Excitation (SE) 注意力机制是一种专注于增强网络模型对不同特征通道的重要性理解的机制。它通过对通道维度上的特征进行动态调整&#xff0c;增强了网络对重要特征的敏感性。 源码 import numpy as np import torch from torch import nn fro…...

【正点原子K210连载】第三十二章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第三十二章 音频FFT实验 本章将介绍CanMV下FFT的应用&#xff0c;通过将时域采集到的音频数据通过FFT为频域。通过本章的学习&#xff0c;读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节&#xff1a; 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…...

Android Studio修改默认.m2与Gradle user home缓存位置

Android Studio修改默认.m2与Gradle user home缓存位置 1、修改Gradle user home的方法&#xff1a; android studio配置默认.gradle路径_android studio gradle在哪-CSDN博客文章浏览阅读2k次。当android studio新建一个项目时候&#xff0c;默认的.gradle路径均认为是在c盘的…...

BFS解决单源最短路问题

目录 迷宫中离入口最近的出口 最小基因变化 单词接龙 为高尔夫比赛砍树 迷宫中离入口最近的出口 题目 思路 使用宽度优先遍历解决这道题&#xff0c;需要一个二维数组标记是否被遍历过&#xff0c;也需要一个队列辅助完成宽度优先遍历&#xff0c;类似于水波纹一样&#x…...

Linux运维、Windows运维常用命令,保存起来当手册用

文章目录 一、centos基本命令1、升级内核到最新版本2、文件句柄数限制优化3、ssh、sftp、scp等远程命令4、find文件查找5、vi命令 二、windows常用操作 一、centos基本命令 1、升级内核到最新版本 # 1、查看内核版本 [rootlocalhost ~]# cat /etc/centos-release CentOS Linu…...

下载用的网站怎么做/网站开发是做什么的

一、 4.2.5版本下载 链接: https://pan.baidu.com/s/1qKQ9Kzb7qtjfwu8msBNRHA 密码: seun 二、安装 先将下载好的压缩包解压&#xff0c;然后打开 shell 终端&#xff0c;切换到你已经解压好的文件的bin目录下&#xff0c;然后执行下面的命令&#xff1a; install_compass …...

专业网站优化公司报价/要怎么网络做推广

2019独角兽企业重金招聘Python工程师标准>>> python 移动文件 利用python写一些简单的脚本整理程序&#xff0c;为生活服务是一个目标 这个程序就是为了移动指定文件下的指定类型的文件到目标文件下 # -*- coding: utf-8 -*-import os import sys import shutilprin…...

做网站所需要的项/优化的定义

前提&#xff1a;过年放假回家.用360无线网卡分了一个网络出来,发现虚拟机启动后不能用以前的xshell去远程连接. 于是自己把网线插到电脑上面,笔记本用有线网络,仍然连不上,手动设置IP 不行 最后 无奈各种方法尝试之后 .重启网络服务 用到了命令: service network restart …...

贵阳网站建设公司排名/怎么找需要做推广的公司

转自http://blog.csdn.net/gzlaiyonghao/article/details/1674808 Python Python的优点&#xff1a; 1、Python比其它语言有更多扩展模块。 2、在网上可以找到很多Python教程。不仅如此&#xff0c;还有大量的英文书籍和资料。Python.org有很多为初学者准备的依主题组织的资料、…...

自己做的网站怎么接支付宝/seo营销工具

导读&#xff1a; 一、static 请先看下面这段程序&#xff1a; public class Hello{ public static void main(String[] args){ //(1) System.out.println("Hello,world!"); //(2) } } 看过这段程序&#xff0c;对于大多数学过Java 的从来说&#xff0c;都不…...

手机网站绑定域名/郑州百度快照优化

外边距折叠指的是毗邻的两个或多个外边距 (margin) 会合并成一个外边距&#xff0c;本文详细的介绍了一下css外边距折叠的实现&#xff0c;分为3种情况&#xff0c;非常具有实用价值&#xff0c;需要的朋友可以参考下前文这是的一个经典的老问题&#xff0c;因为之前刚好有读者…...