前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ArkTS基础语法---模块

ArkTS基础语法---模块

原创
作者头像
IT蜗壳-Tango
发布2024-05-06 22:53:36
3280
发布2024-05-06 22:53:36
举报
文章被收录于专栏:ArkUI-X从入门到实践

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

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

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

导出

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

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

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

代码语言:javascript
复制
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可访问从导入路径指定的模块导出的所有实体:

代码语言:javascript
复制
import * as Utils from './utils'Utils.X // 表示来自Utils的XUtils.Y // 表示来自Utils的Y

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

代码语言:javascript
复制
import { X, Y } from './utils'X // 表示来自utils的XY // 表示来自utils的Y

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

代码语言:javascript
复制
import { X as Z, Y } from './utils'Z // 表示来自Utils的XY // 表示来自Utils的YX // 编译时错误:'X'不可见

动态导入

应用开发的有些场景中,如果希望根据条件导入模块或者按需导入模块,可以使用动态导入代替静态导入。

import()语法通常称为动态导入dynamic import,是一种类似函数的表达式,用来动态导入模块。以这种方式调用,将返回一个promise。

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

代码语言:javascript
复制
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)。

代码语言:javascript
复制
// say.tsexport function hi() {  console.log('Hello');}export function bye() {  console.log('Bye');}

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

代码语言:javascript
复制
async function test() {  let ns = await import('./say');  let hi = ns.hi;  let bye = ns.bye;  hi();  bye();}

导入HarmonyOS SDK的开放能力

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

代码语言:javascript
复制
import UIAbility from '@ohos.app.ability.UIAbility';

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

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

  • 方式一:导入Kit下单个模块的接口能力。例如:import { UIAbility } from '@kit.AbilityKit';
  • 方式二:导入Kit下多个模块的接口能力。例如:import { UIAbility, Ability, Context } from '@kit.AbilityKit';
  • 方式三:导入Kit包含的所有模块的接口能力。例如:import * as module from '@kit.AbilityKit'; 其中,“module”为别名,可自定义,然后通过该名称调用模块的接口。 说明 方式三可能会导入过多无需使用的模块,导致编译后的HAP包太大,占用过多资源,请谨慎使用。

顶层语句

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

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

程序入口

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

代码语言:javascript
复制
function main() {  console.log('this is the program entry');}

关键字

this

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

示例

代码语言:javascript
复制
class A {  count: string = 'a'  m(i: string): void {    this.count = i;  }}

使用限制:

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

示例

代码语言:javascript
复制
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的指向:

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

---

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导出
  • 导入
  • 顶层语句
  • 程序入口
  • 关键字
    • this
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档