首页 > 其他分享 >HarmonyOS NEXT - ArkTS语言 - 模块、关键字、空安全

HarmonyOS NEXT - ArkTS语言 - 模块、关键字、空安全

时间:2024-06-19 14:01:35浏览次数:11  
标签:ArkTS nick NEXT HarmonyOS 导入 let 模块 import null

模块

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

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

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

导出

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

未导出的声明名称被视为私有名称,只能在声明该名称的模块中使用。

注意:通过export方式导出,在导入时要加{}。
 

export class Point {
  x: number = 0
  y: number = 0
  constructor(x: number, y: number) {
    this.x = x;
    this.y = y;
  }
}
export let Origin = new Point(0, 0);
export function Distance(p1: Point, p2: Point): number {
  return Math.sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
}

导入

静态导入

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

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

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

假设模块具有路径“./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()语法通常称为动态导入dynamic import,是一种类似函数的表达式,用来动态导入模块。以这种方式调用,将返回一个promise。

如下例所示,import(modulePath)可以加载模块并返回一个promise,该promise resolve为一个包含其所有导出的模块对象。该表达式可以在代码中的任意位置调用。
 

let modulePath = prompt("Which module to load?");
import(modulePath)
.then(obj => <module object>)
.catch(err => <loading error, e.g. if no such module>)

如果在异步函数中,可以使用let module = await import(modulePath)。
 

// say.ts
export function hi() {
  console.log('Hello');
}
export function bye() {
  console.log('Bye');
}

那么,可以像下面这样进行动态导入:
 

async function test() {
  let ns = await import('./say');
  let hi = ns.hi;
  let bye = ns.bye;
  hi();
  bye();
}

更多的使用动态import的业务场景和使用实例见动态import

导入HarmonyOS SDK的开放能力

HarmonyOS SDK提供的开放能力(接口)也需要在导入声明后使用。可直接导入接口模块来使用该模块内的所有接口能力,例如:
 

import UIAbility from '@ohos.app.ability.UIAbility';

从HarmonyOS NEXT Developer Preview 1版本开始引入Kit概念。SDK对同一个Kit下的接口模块进行了封装,开发者在示例代码中可通过导入Kit的方式来使用Kit所包含的接口能力。其中,Kit封装的接口模块可查看SDK目录下Kit子目录中各Kit的定义。

通过导入Kit方式使用开放能力有三种方式:

  • 方式一:导入Kit下单个模块的接口能力。例如:
    
    
    1. import { UIAbility } from '@kit.AbilityKit';

  • 方式二:导入Kit下多个模块的接口能力。例如:
    
    
    1. import { UIAbility, Ability, Context } from '@kit.AbilityKit';

  • 方式三:导入Kit包含的所有模块的接口能力。例如:
    
    
    1. import * as module from '@kit.AbilityKit';

    其中,“module”为别名,可自定义,然后通过该名称调用模块的接口。

    说明

    方式三可能会导入过多无需使用的模块,导致编译后的HAP包太大,占用过多资源,请谨慎使用。

     

顶层语句

模块可以包含除return语句外的任何模块级语句。

如果模块包含主函数(程序入口),则模块的顶层语句将在此函数函数体之前执行。否则,这些语句将在执行模块的其他功能之前执行。

程序入口

程序(应用)的入口是顶层主函数。主函数应具有空参数列表或只有string[]类型的参数。
 

function main() {
  console.log('this is the program entry');
}

关键字

this

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

示例

 

class A {
  count: string = 'a'
  m(i: string): void {
    this.count = i;
  }
}

 

使用限制:

  • 不支持this类型
  • 不支持在函数和类的静态方法中使用this

示例


class A {
  n: number = 0
  f1(arg1: this) {} // 编译时错误,不支持this类型
  static f2(arg1: number) {
    this.n = arg1;  // 编译时错误,不支持在类的静态方法中使用this
  }
}

function foo(arg1: number) {
  this.n = i;       // 编译时错误,不支持在函数中使用this
}

 

关键字this的指向:

  • 调用实例方法的对象
  • 正在构造的对象

空安全

默认情况下,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 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方法如果设置了昵称,则返回昵称;否则,返回空字符串:

 

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

 

可选链

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

 

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有不为空的nick属性,则输出spouse.nick。否则,输出undefined:

 

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

ArkUI支持

本节演示ArkTS为创建图形用户界面(GUI)程序提供的机制。ArkUI基于TypeScript提供了一系列扩展能力,以声明式地描述应用程序的GUI以及GUI组件间的交互。

ArkUI示例

MVVM应用示例提供了一个完整的基于ArkUI的应用程序,以展示其GUI编程功能。

有关ArkUI功能的更多详细信息,请参见ArkUI基本语法概述

标签:ArkTS,nick,NEXT,HarmonyOS,导入,let,模块,import,null
From: https://blog.csdn.net/u011143672/article/details/139741998

相关文章

  • HarmonyOS个人项目第一周遇到的问题(第二周发的,忘记得发博客了)
    项目介绍:在浏览官方文档的时候看到可以将图片旋转,所以在考虑是不是可以做一个类似于拼图的小游戏(不是不想做难的,主要是菜,边学边做)问题描述看的官方文档不会用,因为一开始看到的不是图片的属性是一个看不懂的东西里面的原因分析:就是单纯找错命令了解决方案:在百度......
  • HarmonyOS开发从入门到跨平台系列:深入了解鸿蒙项目的核心结构
    前言深圳已经发了2024年关于鸿蒙软件生态的规划,如果目标达到,过几年很有可能出现iOSAndroid鸿蒙三足鼎立的情况,因此我们客户端程序员有必要储备一下鸿蒙知识。接下来我将分几篇文章介绍鸿蒙开发的入门、实战和跨平台相关知识,今天这篇文章作为开篇,主要介绍一下鸿蒙开......
  • 【鸿蒙开发教程】详解HarmonyOS Next UI开发技巧
    前言根据研究机构CounterpointResearch发布的最新数据,2024年第一季度,鸿蒙OS份额由去年一季度的8%上涨至17%,iOS份额则从20%下降至16%。这意味着,华为鸿蒙OS在中国市场的份额超越苹果iOS,已成中国第二大操作系统随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式的......
  • 【鸿蒙实战开发案例】如何构建一个HarmonyOS应用工程
    前言随着春节假期结束各行各业复产复工,一年一度的春招也持续火热起来。最近,有招聘平台发布了《2024年春招市场行情周报(第一期)》。总体来说今年的就业市场还是人才饱和的状态,竞争会比较激烈。但是,通过报告我们也能看到让人眼前一亮的信息,比如华为鸿蒙系统对应的人才市场就......
  • 【鸿蒙开发教程】HarmonyOS NEXT对于游戏类App的基础支持
    前言根据研究机构CounterpointResearch发布的最新数据,2024年第一季度,鸿蒙OS份额由去年一季度的8%上涨至17%,iOS份额则从20%下降至16%。这意味着,华为鸿蒙OS在中国市场的份额超越苹果iOS,已成中国第二大操作系统随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式的......
  • 【鸿蒙教程】华为HarmonyOS NEXT 应用开发 实现日常提醒应用
    前言根据研究机构CounterpointResearch发布的最新数据,2024年第一季度,鸿蒙OS份额由去年一季度的8%上涨至17%,iOS份额则从20%下降至16%。这意味着,华为鸿蒙OS在中国市场的份额超越苹果iOS,已成中国第二大操作系统。随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式......
  • Hexo博客Next主题更换cdn加速访问
    有时候访问我的博客时,总是会出现cdn.jsdelivr.net无法访问或者访问速度过慢的情况。我的博客园使用的是BNDong/Cnblogs-Theme-SimpleMemory主题,也遇到的这样的情况。经过我的一番折腾之后,将js文件转移到了我自己的OSS中,并且又经过了我的一番折腾之后,设置好了跨域资源共享(CORS)策略,......
  • HarmonyOS_多线程
    并发是指在同一时间段内,能够处理多个任务的能力。为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,HarmonyOS系统提供了异步并发和多线程并发两种处理策略。异步并发是指异步代码在执行到一定程度后会被暂停,以便在未来某个时间点继续执行,这种情况下,同一时间只有一......
  • HCIP-HarmonyOS Application DeveloperV1.0 考点
    系统及应用场景介绍系统及应用场景介绍HarmonyOS三大特征:“硬件互助,资源共享”、“一次开发,多端部署”、“统一OS,弹性部署”HarmonyOSConnect(中文名称:鸿蒙智联)是华为消费者业务面向生态智能硬件的全新技术品牌。HarmonyOSConnect来自WorksWithHUAWEIHiLink品牌......
  • 小白next项目初步上手搭建一个随机社会信用代码生成及验证功能网站
    先看看效果网址是:https://xinyongdaima.aitoolpro.work/#主要实现功能实现随机社会信用代码生成及验证;无数据存储功能;技术栈next.jstailwind工具sublimeChatGPT4o步骤准备工作:需要电脑安装node生成项目打开终端并运行以下命令:npxcreate-next-app@late......