一、鸿蒙原生开发语言:ArkTS语言介绍

前言:

ArkTS语言是官方主推的开发鸿蒙原生App应用的语言,该语言的语法和TypeScript比较相似,对于有前端基础的同学,学习起来应该比较容易。本节主要介绍下ArkTS与TypeScript的关系,以及ArkTS的特性。总结一句话,ArkTS是语法的定义,ArkUI是基于该语法的UI框架。鸿蒙原生开发语言集成了TS的语法(ArkTS),集成了目前流行的前端框架中的数据驱动UI的能力,并提供一套现成的UI框架(ArkUI),这样的一个超集

一、ArkTS 与 TypeScript的关系

ArkTS是HarmonyOS优选的主力应用开发语言。目前流行的编程语言TypeScript是在JavaScript基础上通过添加类型定义扩展而来的,而ArkTS则是TypeScript的进一步扩展。ArkTS旨在保持TypeScript的大部分语法,同时通过规范定义强化开发期静态检查和分析,提升程序执行稳定性和性能。(可以认为ArkTS是在严格模式下执行的js程序,限制了很多js和TS语法的使用,为的就是提高程序执行稳定性和性能,把一些可能引起异常的代码在编译阶段就检查出来)。如果有TS开发经验的同学,不用担心具体ArkTS限制了哪些TS的语法,大家可以就先按照TS语法来实现,如果不符合ArkTS的规则,编译器会报错,大家可以根据报错信息,到这个链接去查询文档中心里面会有对应的转换案例

对比标准TypeScript的差异主要有以下几点:

1、强制使用静态类型

静态类型是ArkTS最重要的特性之一。即在参数定义或者方法定义时,必须使用明确的参数类型,不能使用any,unkown,如果参数可能为空,必须显示声明undefined类型。这样在编译阶段就能检查代码正确性,减少运行时类型检查,提升性能。

如下:TypeScript支持如下变量声明为any或者unknown类型,但是ArkTS中必须显示指定具体类型,否则编译器会报错

// 不支持:
function some_api_function():any{
}
let res: any = some_api_function('hello', 'world');
// `res`是什么?错误代码的数字?字符串?对象?
// 该如何处理它?

// 支持:
class CallResult {
  public succeeded(): boolean { ... }
  public errorMessage(): string { ... }
}
function some_api_function():CallResult{
}

let res: CallResult = some_api_function('hello', 'world');
if (!res.succeeded()) {
  console.log('Call failed: ' + res.errorMessage());
}

2、禁止在运行时改变对象布局

为实现最大性能,ArkTS要求在程序执行期间不能更改对象布局。这个主要指,对象一旦定义完成,在程序运行阶段,就不允许删除对象属性,或者增加对象属性

class Point {
  public x: number = 0
  public y: number = 0

  constructor(x: number, y: number) {
    this.x = x;
    this.y = y;
  }
}

// 无法从对象中删除某个属性,从而确保所有Point对象都具有属性x
let p1 = new Point(1.0, 1.0);
delete p1.x;           // 在TypeScript和ArkTS中,都会产生编译时错误
delete (p1 as any).x;  // 在TypeScript中不会报错;在ArkTS中会产生编译时错误

// Point类没有定义命名为z的属性,在程序运行时也无法添加该属性
let p2 = new Point(2.0, 2.0);
p2.z = 'Label';           // 在TypeScript和ArkTS中,都会产生编译时错误
(p2 as any).z = 'Label';   // 在TypeScript中不会报错;在ArkTS中会产生编译时错误

3、限制运算符语义

为获得更好的性能并鼓励开发者编写更清晰的代码,ArkTS限制了一些运算符的语义。比如,一元加法运算符只能作用于数字,不能用于其他类型的变量。

// 一元运算符`+`只能作用于数值类型:
let t = +42;   // 合法运算
let s = +'42'; // 编译时错误

4、不支持Structural typing

对Structural typing的支持需要在语言、编译器和运行时进行大量的考虑和仔细的实现。另外,由于ArkTS使用静态类型,运行时为了支持这个特性需要额外的开销。

什么叫Structural typing:比如对象类型T和U没有继承关系或没有implements相同的接口,但由于它们具有相同的方法,它们“在某种程度上是相等的”。

如下:T和U具有相同的方法greet(),但它们没有继承关系。当支持将T赋值给U表示支持Structural typing。

class T {
  public name: string = ''

  public greet(): void {
    console.log('Hello, ' + this.name);
  }
}

class U {
  public name: string = ''

  public greet(): void {
    console.log('Greetings, ' + this.name);
  }
}

// 将T赋值给U
let u:U = new T()

二、ArkTS在UI框架上的扩展,并提供系统自带UI框架,ArkUI

ArkUI框架,提供了丰富的系统组件(按钮,弹窗,文本,图片,各种布局,动画等),ArkTS主要扩展能力如下:

1、基本语法:

ArkTS定义了声明式UI描述、自定义组件和动态扩展UI元素的能力,再配合ArkUI开发框架中的系统组件及其相关的事件方法、属性方法等共同构成了UI开发的主体。

2、状态管理:

这里的状态和前端框架react、vue中的状态非常类似,都是通过状态变量的刷新来驱动UI的更新。ArkTS提供了多维度的状态管理机制。在UI开发框架中,与UI相关联的数据可以在组件内使用,也可以在不同组件层级间传递,比如父子组件之间、爷孙组件之间,还可以在应用全局范围内传递或跨设备传递。另外,从数据的传递形式来看,可分为只读的单向传递和可变更的双向传递。开发者可以灵活地利用这些能力来实现数据和UI的联动。

3、渲染控制:

这里渲染控制也和前端框架react、vue中类似,提供了if条件渲染,ForEach循环渲染等。ArkTS也提供了渲染控制的能力。条件渲染可根据应用的不同状态,渲染对应状态下的UI内容。循环渲染可从数据源中迭代获取数据,并在每次迭代过程中创建相应的组件。数据懒加载从数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值