鸿蒙应用开发-入门导览

698 阅读23分钟

申请开发者账号

注册华为账号

打开这个网站,会提示你进行注册

developer.huawei.com/consumer/cn…

developer.huawei.com/consumer/cn…

集成开发环境

developer.huawei.com/consumer/cn…

  1. 下载IDE developer.huawei.com/consumer/cn…
  2. 查阅开发文档 developer.huawei.com/consumer/cn…
  3. 练手一些示例代码 developer.huawei.com/consumer/cn…
  4. 一些简单的自动化测试软件 developer.huawei.com/consumer/cn…
  5. 其他的可用软件 developer.huawei.com/consumer/cn…

了解应用程序包组成结构

developer.huawei.com/consumer/cn…

鸿蒙应用有两种类型,一种是常规应用,可以在桌面看到启动图标。一种是元服务,无法在桌面看到图标,但它确实存在于系统中,需要特定入口或元服务中心才能看到。

鸿蒙中用于上架的是.app文件,.app文件内部包含至少一个.hap文件,一个.hap文件包括0到多个.hsp或.har文件。其中.hap、.hsp、.har文件都是Module编译的产物

Module类型

鸿蒙中一个应用工程由多个Module组成,Module按照使用场景分为两种类型:

  1. Ability类型的Module,编译后生成.hap文件,可以进行独立安装和运行,是应用安装的基本单位。它又分为两种类型

    1. entry类型的Module:应用的主模块,编译后生成entry类型的HAP。同一个应用分发到同一类型的设备上的应用程序包,只能包含唯一一个entry类型的HAP
    2. feature类型的Module:应用的动态特性模块,编译后生成feature类型的HAP。应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装
  2.  Library类型的Module, 用于实现代码和资源共享,同一个Library类型的Module可以被其他的Module多次引用。它又分为Static和Shared两种类型,编译后会生成共享包

    1.  Static Library:静态共享库: 编译后会生成一个以.har为后缀的文件,即静态共享包HAR(Harmony Archive)。
    2. Shared Library:动态共享库: 编译后会生成一个以.hsp为后缀的文件,即动态共享包HSP(Harmony Shared Package)。

HAR和HSP在APP包中的形态示意图

Module产物HAP、HSP、HAR文件以及作用

Module类型包类型说明
AbilityHAP应用的功能模块,可以独立安装和运行,必须包含一个entry类型的HAP,可选包含一个或多个feature类型的HAP。
Static LibraryHAR静态共享包,编译态复用,实现多个模块或多个工程共享ArkUI组件、资源等相关代码HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝- 支持应用内共享,也可以发布后供其他应用使用。- 作为二方库,发布到OHPM私仓,供公司内部其他应用使用。- 作为三方库,发布到OHPM中心仓,供其他应用使用。- 多包(HAP/HSP)引用相同的HAR时,会造成多包间代码和资源的重复拷贝,从而导致应用包膨大。
Shared LibraryHSP动态共享包,运行时复用,实现应用内的代码和资源的共享HSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份- 当前仅支持应用内共享- HSP不支持独立发布,而是跟随其宿主应用的APP包一起发布,与宿主应用同进程,具有相同的包名和生命周期- 当多包(HAP/HSP)同时引用同一个共享包时,采用HSP替代HAR,可以避免HAR造成的多包间代码和资源的重复拷贝,从而减小应用包大小。

Module内文件从开发态到编译态的变化

developer.huawei.com/consumer/cn…

上面我们知道Module有Entry和Library区分,Entry类型的Module编译产生.hap文件,Library类型的Module编译产生.hsp或.har文件。

他们对应的开发态与编译态的工程结构视图如下

从开发态到编译态,Module中的文件会发生如下变更:

  • ets目录:ArkTS源码编译生成.abc文件。
  • resources目录:AppScope目录下的资源文件会合入到Module下面资源目录中,如果两个目录下的存在重名文件,编译打包后只会保留AppScope目录下的资源文件。
  • module配置文件:AppScope目录下的app.json5文件字段会合入到Module下面的module.json5文件之中,编译后生成HAP或HSP最终的module.json文件。

编译发布与上架部署流程图

应用配置文件概述(Stage模型)

一个鸿蒙App项目中包含一个app.json5配置文件 用于配置全局信息,每个Module包含对应的module.json5配置文件用于配置Ability和权限信息

app.json5配置文件module.json5配置文件

ArkTS语言

developer.huawei.com/consumer/cn…

ArkUI

developer.huawei.com/consumer/cn…

声明式UI的组成部分

ArkUI中的组件、状态变量功能都是装饰器实现的,装饰器用于装饰类、结构、方法以及变量,并赋予其特殊的含义

  1. 所有的 自定义组件 都是通过struct定义的
  2. UI描述:以声明式的方式描述UI的结构,UI是
  3. @Entry 装饰组件为入口组件,可以传递命名路由名称和localStorage
  4. @Component 装饰自定义组件,使组件具备组件化的能力
  5. @State 装饰状态变量,驱动UI更新
  6. @Builder装饰器:自定义构建函数:封装文件内全局或自定义组件内的UI描述,所需的数据可以通过按值或按引用传递
  7. @BuilderParam装饰器:引用@Builder函数:接收@Builder封装的UI,如果只有一个@BuilderParam参数,还可以使用尾随闭包语法
  8. wrapBuilder:封装全局@Builder:封装文件内的全局Builder进行传递和切换展示
  9. @Styles装饰器:定义组件重用样式:在组件所在文件全局或自定义组件内部 定义可复用的样式,减少重复代码
  10. @Extend装饰器:定义扩展组件样式:扩展一些系统组件的属性,也是为了减少代码。它只能扩展系统的组件
  11. stateStyles:多态样式:定义根据不同状态下的样式,具体状态下的样式可以是自定义,也可以是@Styles定义好的
  12. @AnimatableExtend装饰器:定义可动画属性 可以定义一些能够进行动画的自定义属性
  13. @Require装饰器:校验构造传参 按照命名参数传递,所有的参数都是可选的,可以使用@Require要求某个参数必传

布局元素的组成

  • 组件区域(蓝区方块):组件区域表示组件的大小,widthheight属性用于设置组件区域的大小。
  • 组件内容区(黄色方块):组件内容区大小为组件区域大小减去组件的border值,组件内容区大小会作为组件内容(或者子组件)进行大小测算时的布局测算限制。
  • 组件内容(绿色方块):组件内容本身占用的大小,比如文本内容占用的大小。组件内容和组件内容区不一定匹配,比如设置了固定的width和height,此时组件内容的大小就是设置的width和height减去padding和border值,但文本内容则是通过文本布局引擎测算后得到的大小,可能出现文本真实大小小于设置的组件内容区大小。当组件内容和组件内容区大小不一致时,align属性生效,定义组件内容在组件内容区的对齐方式,如居中对齐。
  • 组件布局边界(虚线部分):组件通过margin属性设置外边距时,组件布局边界就是组件区域加上margin的大小。

自定义组件的生命周期

developer.huawei.com/consumer/cn…

一个被@Entry装饰的组件(页面)生命周期如下

@Component提供的生命周期

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。
  • onDidBuild:组件build()函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。
  • aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

@Entry提供的生命周期

  • onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景
  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景
  • onBackPress:当用户点击返回按钮时触发

自定义组件布局和优化

布局分为两种
  1. 自定义子组件排布的方式,通过下面方式实现

    1. onMeasureSize:组件每次布局时触发,计算子组件的尺寸,其执行时间先于onPlaceChildren。
    2. onPlaceChildren:组件每次布局时触发,设置子组件的起始位置
  2. 子组件的排布方式固定,子组件可由外部自定义传入,通过下面方式实现

    1. @BuilderParam装饰器:引用@Builder函数:接收@Builder装饰器:自定义构建函数 自定义的子组件
优化
  1. 明确 自定义组件成员属性访问限定符为private、public等
  2. 使用 自定义组件冻结功能 freezeWhenInactive 控制自定义组件非激活状态时不进行刷新

状态管理

第一版

State和View(UI)之间的关系

ArkUI中状态变量分为 管理组件拥有的状态 和 管理应用拥有的状态

管理组件拥有的状态

即图中Components级别的状态管理:

@StorageLink/@LocalStorageLink实现应用和组件状态的双向同步,通过@StorageProp/@LocalStorageProp实现应用和组件状态的单向同步

  1. @State:@State装饰的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源。当其数值改变时,会引起相关组件的渲染刷新。
  2. @Prop:@Prop装饰的变量可以和父组件建立单向同步关系,@Prop装饰的变量是可变的,但修改不会同步回父组件。
  3. @Link:@Link装饰的变量可以和父组件建立双向同步关系,子组件中@Link装饰变量的修改会同步给父组件中建立双向数据绑定的数据源,父组件的更新也会同步给@Link装饰的变量。
  4. @Provide/@Consume:@Provide/@Consume装饰的变量用于跨组件层级(多层组件)同步状态变量,可以不需要通过参数命名机制传递,通过alias(别名)或者属性名绑定。
  5. @Observed:@Observed装饰class,需要观察多层嵌套场景的class需要被@Observed装饰。单独使用@Observed没有任何作用,需要和@ObjectLink、@Prop连用。
  6. @ObjectLink:@ObjectLink装饰的变量接收@Observed装饰的class的实例,应用于观察多层嵌套场景,和父组件的数据源构建双向同步
  7. @Track装饰器:class对象属性级更新:当一个class对象是状态变量时,@Track装饰的属性发生变化,只会触发该属性关联的UI更新;而未被标记的属性不能在UI中使用。

@Observed/@ObjectLink@ObservedV2装饰器和@Trace装饰器:类属性变化观测 可以观察嵌套场景,其他的状态变量仅能观察第一层

管理应用拥有的状态

即图中Application级别的状态管理:

  1. AppStorage是应用程序中的一个特殊的单例LocalStorage对象,是应用级的数据库,和进程绑定,通过@StorageProp@StorageLink装饰器可以和组件联动。
  2. AppStorage是应用状态的“中枢”,将需要与组件(UI)交互的数据存入AppStorage,比如持久化数据PersistentStorage和环境变量Environment。UI再通过AppStorage提供的装饰器或者API接口,访问这些数据。
  3. 框架还提供了LocalStorage,AppStorage是LocalStorage特殊的单例。LocalStorage是应用程序声明的应用状态的内存“数据库”,通常用于页面级的状态共享,通过@LocalStorageProp@LocalStorageLink装饰器可以和UI联动
  4. 持久化数据PersistentStorage环境变量Environment都是通过AppStorage中转,才可以和UI交互。它的@StorageProp和@StorageLink和@LocalStorageProp、@LocalStorageLink类似,一个单向同步,一个双向同步
  5. PersistentStorage:持久化存储UI状态:PersistentStorage将状态持久化存储,当使用时我们需要先使用PersistentStorage将对应key的数据同步到AppStorage,然后再让AppStorage刷新UI和往回同步数据
  6. Environment:设备环境查询:Environment和PersistentStorage相似,只不过它的所有值都是只读的

第二版

状态管理V1使用代理观察数据,当创建一个状态变量时,同时也创建了一个数据代理观察者。该观察者可感知代理变化,但无法感知实际数据变化,因此在使用上有如下限制:

  • 状态变量不能独立于UI存在,同一个数据被多个视图代理时,在其中一个视图的更改不会通知其他视图更新。
  • 只能感知对象属性第一层的变化,无法做到深度观测和深度监听。
  • 在更改对象中属性以及更改数组中元素的场景下存在冗余更新的问题。
  • 装饰器间配合使用限制多,不易用。组件中没有明确状态变量的输入与输出,不利于组件化。

状态管理V2将观察能力增强到数据本身,数据本身就是可观察的,更改数据会触发相应的视图的更新。相较于状态管理V1,状态管理V2有如下优点:

  • 状态变量独立于UI,更改数据会触发相应视图的更新。
  • 支持对象的深度观测和深度监听,且深度观测机制不影响观测性能。
  • 支持对象中属性级精准更新及数组中元素的最小化更新。
  • 装饰器易用性高、拓展性强,在组件中明确输入与输出,有利于组件化。

  • @ObservedV2:@ObservedV2装饰器装饰class,使得被装饰的class具有深度监听的能力。@ObservedV2和@Trace配合使用可以使class中的属性具有深度观测的能力。
  • @Trace:@Trace装饰器装饰被@ObservedV2装饰的class中的属性,被装饰的属性具有深度观测的能力。
  • @ComponentV2:使用@ComponentV2装饰的struct中能使用新的装饰器。例如:@Local、@Param、@Event、@Once、@Monitor、@Provider、@Consumer。
  • @Local:@Local装饰的变量为组件内部状态,无法从外部初始化。
  • @Param:@Param装饰的变量作为组件的输入,可以接受从外部传入初始化并同步。
  • @Once:@Once装饰的变量仅初始化时同步一次,需要与@Param一起使用。
  • @Event:@Event装饰方法类型,作为组件输出,可以通过该方法影响父组件中变量。
  • @Monitor:@Monitor装饰器用于@ComponentV2装饰的自定义组件或@ObservedV2装饰的类中,能够对状态变量进行深度监听。
  • @Provider和@Consumer:用于跨组件层级双向同步。
  • @Computed:计算属性,在被计算的值变化的时候,只会计算一次。主要应用于解决UI多次重用该属性从而重复计算导致的性能问题。
  • !!语法:双向绑定语法糖

渲染控制

目前鸿蒙中只有这三种渲染控制语法:if/else:条件渲染 ForEach:循环渲染 LazyForEach:数据懒加载Repeat:循环渲染(推荐)ContentSlot:混合开发

Stage模型开发概述

developer.huawei.com/consumer/cn…

Stage模型中各组成部分之间的关系

  1. 一个应用可以包含多个HAP包,.hap是安装和运行的基本单位
  2. 每个HAP在运行期都有一个AbilityStage类实例,当HAP中的代码首次被加载到进程中的时候,系统会先创建AbilityStage实例
  3. Ability分为UIAbility组件ExtensionAbility组件,UIAbility用于和用户交互,ExtensionAbility用于特定场景,比如输入法、卡片等
  4. 每个UIAbility实例都会与一个WindowStage类实例绑定,WindowStage管理应用进程内的窗口活动和生命周期
  5. 一个Window内可以有多个页面,对应我们开发中的@Entry装饰的组件

应用上下文Context

developer.huawei.com/consumer/cn…

Stage模型中,各部分都有对应的上下文,各类Context的持有关系

各类Context的继承关系

UIAbility组件概述

developer.huawei.com/consumer/cn…

UIAbility中各部分的生命周期流转

  1. onCreate:在应用加载过程中,UIAbility实例创建完成时系统会调用onCreate()回调。可以在该回调中进行页面初始化操作
  2. onWindowStageCreate:UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。WindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI加载、设置WindowStage的事件订阅
  3. onForeground:在UIAbility的UI可见之前,如UIAbility切换至前台时触发。可以在onForeground()回调中申请系统需要的资源或者重新申请在onBackground()中释放的资源
  4. onBackground:,在UIAbility的UI完全不可见之后,如UIAbility切换至后台时候触发。可以在onBackground()回调中释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。
  5. onWindowStageDestroy:在UIAbility实例销毁之前,则会先进入onWindowStageDestroy()回调,可以在该回调中释放UI资源
  6. onDestroy:在UIAbility实例销毁时触发。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作

UIAbility中启动模式有三种

UIAbility启动参数Want匹配规则

UIAbility的启动分为显示启动与隐式启动

  1. 显式Want:在启动目标应用组件时,调用方传入的want参数中指定了abilityName和bundleName,称为显式Want
  2. 隐式Want:在启动目标应用组件时,调用方传入的want参数中未指定abilityName,称为隐式Want

显式Want与隐式Want匹配规则

组件启动规则(Stage模型)

developer.huawei.com/consumer/cn…

同设备组件启动规则

设备内启动组件,不同场景下的规则不同,可分为如下三种场景

分布式跨设备组件启动规则

跨设备启动组件,不同场景下的规则不同,可分为如下三种场景

进程、线程模型及组成部分

developer.huawei.com/consumer/cn…

图中相同颜色的为一个进程

  1. 一个应用中,所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility运行在主进程中
  2. 一个应用中,所有所有同一类型的ExtensionAbility各自有单独的进程
  3. 整个手机系统中 WebView拥有独立的渲染进程

developer.huawei.com/consumer/cn…

Stage模型下的线程主要有三类:主线程、TaskPool管理的线程池、每一个Worker对应一个线程

注明:自定义的每一个Worker拥有自己独立的线程、TaskPool是对Worker的封装,它维持一个线程池用于高效利用

其他常用快捷入口

Account Kit(华为帐号服务),登录、授权、身份验证等服务

developer.huawei.com/consumer/cn…

ArkData(方舟数据管理),数据持久化、KV存储、关系型数据库存储、Preference存储、分布式存储等

developer.huawei.com/consumer/cn…

UI开发(ArkTS声明式开发范式)

developer.huawei.com/consumer/cn…

常用布局

developer.huawei.com/consumer/cn…

常用组件

developer.huawei.com/consumer/cn…

常用动画

developer.huawei.com/consumer/cn…

一次开发,多端部署 多设备UI、功能、设备流转、交互统一等

developer.huawei.com/consumer/cn…

常用终端命令 hdc、应用安装、拆装包等

developer.huawei.com/consumer/cn…

开发及引用共享包 hsp、har等包的开发、打包和发布

developer.huawei.com/consumer/cn…

hvigor-ohos-plugin构建插件,编写插件自动处理一些逻辑

developer.huawei.com/consumer/cn…

ohpmrc,oh-package.json5 打包编译配置、版本冲突解决等

ohpmrc

developer.huawei.com/consumer/cn…

oh-package.json5

developer.huawei.com/consumer/cn…

常用API参考

公共基础能力:控制台输出、系统能力检测、定时器等

developer.huawei.com/consumer/cn…

Telephony Kit API参考:拨打电话,卡槽信息,网络、信号、通话、蜂窝数据监听,SIM卡,发送短信等

developer.huawei.com/consumer/cn…

Scan Kit API参考:扫码、图片识码、码图生成等

developer.huawei.com/consumer/cn…

Performance Analysis Kit API参考:性能、事件打点,log日志分析,分析性能等功能

developer.huawei.com/consumer/cn…

Location Kit API参考:定位能力

developer.huawei.com/consumer/cn…

Form Kit API参考:卡片开发能力

developer.huawei.com/consumer/cn…

ArkUI API参考:各种组件、容器、动画、绘制等组件,组件绘制监听,获取组件信息等工具

developer.huawei.com/consumer/cn…

ArkTS API参考:容器Map、Set、Array,基础工具,JSON解析,衍生出的集合等等

developer.huawei.com/consumer/cn…

最佳实践

分层架构设计:指导工程开发时的分层逻辑

developer.huawei.com/consumer/cn…

应用开发时分成三个层次:产品定制层(products)、基础特性层(features)和公共能力层(commons)。按照三个层次进行组织文件夹和代码

产品定制层: 各个子目录会被编译成一个Entry类型的HAP,作为应用的主入口

基础特性层: 对于需要通过Ability承载的功能,可以设计为Feature类型的HAP,而对于不需要通过Ability承载的功能,根据是否需要实现按需加载,可以选择设计为HAR模块或者HSP模块,编译后对应HAR包或者HSP包

公共能力层: 各子目录将被编译成HAR包,只能被产品定制层和基础特性层所依赖,不允许存在反向依赖

模块化设计:针对单HAP、多HAP工程的模块化怎么进行设计

developer.huawei.com/consumer/cn…

开发高性能ArkUI

developer.huawei.com/consumer/cn…

更深入知识

方舟字节码基本原理

developer.huawei.com/consumer/cn…

方舟字节码(Ark Bytecode),是由方舟编译器编译ArkTS/TS/JS生成的,提供给方舟运行时解释执行的二进制文件,字节码中的主要内容是方舟字节码指令

一条方舟字节码指令,由操作码(指令的名称)和指令入参列表组成。操作码包含无前缀的操作码和有前缀的操作码两种情况。寄存器、立即数以及string id/method id/literal id,均可以作为指令的入参,除此之外,部分指令中使用累加器作为默认参数

ArkTS高性能编程实践

developer.huawei.com/consumer/cn…

应用切面编程设计

developer.huawei.com/consumer/cn…

插桩原理介绍

addBefore、addAfter、replace接口的原理基于class的ECMAScript语义,即类的静态方法是类的属性,类的实例方法是类的原型对象(prototype)的属性。

原理解析

类的实例会有一个属性__proto__(称为原型),它是指向类的prototype的引用。实例在调用方法时,实际上会先通过__proto__找到类的prototype,再在prototype中找到这个方法,再执行调用逻辑。类的原型对象(prototype)被这个类的所有实例共享,这意味着修改类的原型对象里面存储的方法,会对这个类的所有实例产生效果。

原型对象也有原型__proto__。类的继承就是通过原型来实现的。实例方法的调用实际上在运行时就是通过在原型串联的链上查找方法,找到方法再执行调用

插桩和替换的操作本质上就是将回调参数和原方法组合成一个新的函数,再用新的函数替换原方法

ArkUI组件封装及复用:attributeModifier实现公用组件、wrapBuilder实现组件工厂、@CustomDialog实现自定义弹框

developer.huawei.com/consumer/cn…

UI动态操作:通过NodeContainer和NodeController实现BuilderNode创建、显示、更新、移除和替换

developer.huawei.com/consumer/cn…

组件预创建原理图

NodeController生命周期

NodeController用于控制和反馈对应的NodeContainer上的节点的行为,需要与NodeContainer一起使用

  • makeNode必须要重写的方法,用于构建节点树、返回节点挂载在对应NodeContainer中。在对应NodeContainer创建绑定当前NodeController的时候调用、或者通过rebuild方法调用刷新。
  • aboutToResize当controller对应的NodeContainer在Mesure的时候进行回调,入参为节点的布局大小。
  • aboutToAppear当controller对应的NodeContainer在onAppear的时候进行回调。
  • aboutToDisappear当controller对应的NodeContainer在onDisappear的时候进行回调

应用并发设计

developer.huawei.com/consumer/cn…

ArkTS支持TaskPoolWorker并发能力,他们都是基于Actor模型。Actor模型之间通过通信来进行消息和数据传递

TaskPool和Worker的实现特点对比

实现TaskPoolWorker
内存模型线程间隔离,内存不共享。线程间隔离,内存不共享。
参数传递机制采用标准的结构化克隆算法(Structured Clone)进行序列化、反序列化,完成参数传递。支持ArrayBuffer转移和SharedArrayBuffer共享。采用标准的结构化克隆算法(Structured Clone)进行序列化、反序列化,完成参数传递。支持ArrayBuffer转移和SharedArrayBuffer共享。
参数传递直接传递,无需封装,默认进行transfer。消息对象唯一参数,需要自己封装。
方法调用直接将方法传入调用。在Worker线程中进行消息解析并调用对应方法。
返回值异步调用后默认返回。主动发送消息,需在onmessage解析赋值。
生命周期TaskPool自行管理生命周期,无需关心任务负载高低。开发者自行管理Worker的数量及生命周期。
任务池个数上限自动管理,无需配置。同个进程下,最多支持同时开启8个Worker线程。
任务执行时长上限3分钟(不包含Promise和async/await异步调用的耗时,例如网络下载、文件读写等I/O任务的耗时)。无限制。
设置任务的优先级支持配置任务优先级。不支持。
执行任务的取消支持取消已经发起的任务。不支持。
线程复用支持。不支持。
任务延时执行支持。不支持。
设置任务依赖关系支持。不支持。
串行队列支持。不支持。
任务组支持。不支持。

其他资料参考

  1. 鸿蒙开发官网 developer.huawei.com/consumer/cn…
  2. TypeScript学习  wangdoc.com/typescript/