前言

ArkTS是一种设计用于构建高性能应用的编程语言。它在继承TypeScript语法的基础上进行了优化,以提供更高的性能和开发效率。

许多编程语言在设计之初未考虑移动设备,导致应用运行缓慢、低效且功耗大。随着移动设备在日常生活中越来越普遍,针对移动环境的编程语言优化需求日益增加。ArkTS专为解决这些问题而设计,聚焦提高运行效率。

TypeScript是在JavaScript基础上通过添加类型定义扩展而来的,ArkTS则是TypeScript的进一步扩展。TypeScript提供了一种更结构化的JavaScript编码方法,深受开发者喜爱。ArkTS保持了TypeScript的大部分语法,旨在为现有的TypeScript开发者实现无缝过渡,帮助移动开发者快速上手。

ArkTS的一大特性是它专注于低运行时开销。ArkTS对TypeScript的动态类型特性施加了更严格的限制,以减少运行时开销,提高执行效率。通过取消动态类型特性,ArkTS代码能更有效地被运行前编译和优化,从而实现更快的应用启动和更低的功耗。

ArkTS语言设计中考虑了与TypeScript和JavaScript的互通性。许多移动应用开发者希望重用TypeScript和JavaScript代码及库,因此ArkTS提供与TypeScript和JavaScript的无缝互通,使开发者可以轻松集成TypeScript和JavaScript代码到应用中,充分利用现有代码和库进行ArkTS开发。

基本知识

声明

ArkTS通过声明引入变量、常量、类型和函数。

变量声明

使用关键字let声明的变量可以在程序执行期间具有不同的值。

let hi: string = 'hello';

hi = 'hello, world';

常量声明

使用关键字const声明的只读常量只能被赋值一次。

const hello: string = 'hello';

对常量重新赋值会造成编译时错误。

自动类型推断

如果变量或常量的声明包含初始值,开发者无需显式指定类型,因为ArkTS规范已列举了所有允许自动推断类型的场景。

以下示例中,两条声明语句都是有效的,两个变量都是string类型:

let hi1: string = 'hello';

let hi2 = 'hello, world';

类型

基本类型和引用类型

基本数据类型包括number、string等简单类型,它们可以准确地表示单一的数据类型。基本类型确保数据在存储和访问时是直接的,比较时直接比较其值。

引用类型包括对象、数组和函数等复杂数据结构。这些类型通过引用访问数据,对象和数组可以包含多个值或键值对,函数则可以封装可执行的代码逻辑。引用类型在内存中通过指针访问数据,修改引用会影响原始数据。

number类型

ArkTS提供number类型,任何整数和浮点数都可以被赋给此类型的变量。

数字字面量包括整数字面量和十进制浮点数字面量。

整数字面量包括以下类别:

  • 十进制整数,由数字序列组成。例如:0、117、-345。
  • 十六进制整数,以0x(或0X)开头,包含数字(0-9)和字母a-f或A-F。例如:0x1123、0x00111、-0xF1A7。
  • 八进制整数,以0o(或0O)开头,只能包含数字(0-7)。例如:0o777。
  • 二进制整数,以0b(或0B)开头,只能包含数字0和1。例如:0b11、0b0011、-0b11。

浮点数字面量包括以下部分:

  • 十进制整数,可为有符号数(前缀为“+”或“-”)。
  • 小数点(“.”)。
  • 小数部分(由十进制数字字符串表示)。
  • 指数部分,以“e”或“E”开头,后跟有符号(前缀为“+”或“-”)或无符号整数。

示例:

let n1 = 3.14;

let n2 = 3.141592;

let n3 = .5;

let n4 = 1e2;

 

function factorial(n: number): number {

if (n <= 1) {

return 1;

}

return n * factorial(n - 1);

}

 

factorial(n1) // 7.660344000000002

factorial(n2) // 7.680640444893748

factorial(n3) // 1

factorial(n4) // 9.33262154439441e+157

number类型在表示大整数(即超过-9007199254740991~9007199254740991)时会造成精度丢失。在开发时可以按需使用bigInt类型来确保精度:

let bigIntger: BigInt = BigInt('999999999999999999999999999999999999999999999999999999999999');

console.info('bigIntger' + bigIntger.toString());

boolean类型

boolean类型由true和false两个逻辑值组成。

通常在条件语句中使用boolean类型的变量:

let isDone: boolean = false;

 

// ...

 

if (isDone) {

console.info('Done!');

}

string类型

string类型代表字符序列,可以使用转义字符来表示字符。

字符串字面量由单引号(')或双引号(")之间括起来的零个或多个字符组成。字符串字面量还有一特殊形式,是用反向单引号(`)括起来的模板字面量。

let s1 = 'Hello, world!\n';

let s2 = "this is a string";

let a = 'Success';

let s3 = `The result is ${a}`;

void类型

void类型用于指定函数没有返回值。

此类型只有一个值,同样是void。由于void是引用类型,因此它可以用于泛型类型参数。

class Class<T> {

//...

}

let instance: Class <void>

Object类型

Object类型是所有引用类型的基类型。任何值,包括基本类型的值,都可以直接被赋给Object类型的变量(基本类型值会被自动装箱)。Object类型用于表示除基本类型外的类型。

let o1: Object = 'Alice';

let o2: Object = ['a','b'];

let o3: Object = 1;

array类型

array类型,即数组,是由可赋值给数组声明中指定的元素类型的数据组成的对象。

数组可由数组复合字面量赋值。数组复合字面量是用方括号括起来的零个或多个表达式列表,每个表达式为数组中的一个元素。数组的长度由数组中元素的个数确定。数组中第一个元素的索引为0。

以下示例将创建包含三个元素的数组:

let names: string[] = ['Alice', 'Bob', 'Carol'];

enum类型

enum类型,即枚举类型,是预先定义的一组命名值的值类型,其中命名值又称为枚举常量。

使用枚举常量时必须以枚举类型名称为前缀。

enum ColorSet { Red, Green, Blue }

let c: ColorSet = ColorSet.Red;

常量表达式用于显式设置枚举常量的值。

enum ColorSet { White = 0xFF, Grey = 0x7F, Black = 0x00 }

let c: ColorSet = ColorSet.Black;

Union类型

Union类型,即联合类型,是由多个类型组合成的引用类型。联合类型包含了变量可能的所有类型。

class Cat {

name: string = 'cat';

// ...

}

class Dog {

name: string = 'dog';

// ...

}

class Frog {

name: string = 'frog';

// ...

}

type Animal = Cat | Dog | Frog | number | string | null | undefined;

// Cat、Dog、Frog是一些类型(类或接口)

 

let animal: Animal = new Cat();

animal = new Frog();

animal = 42;

animal = 'dog';

animal = undefined;

// 可以将类型为联合类型的变量赋值为任何组成类型的有效值

可以使用不同机制获取联合类型中的特定类型值。

示例:

class Cat { sleep () {}; meow () {} }

class Dog { sleep () {}; bark () {} }

class Frog { sleep () {}; leap () {} }

 

type Animal = Cat | Dog | Frog;

 

function foo(animal: Animal) {

if (animal instanceof Frog) {

animal.leap(); // animal在这里是Frog类型

}

animal.sleep(); // Animal具有sleep方法

}

Aliases类型

Aliases类型为匿名类型(如数组、函数、对象字面量或联合类型)提供名称,或为已定义的类型提供替代名称。

type Matrix = number[][];

type Handler = (s: string, no: number) => string;

type Predicate <T> = (x: T) => boolean;

type NullableObject = Object | null;

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐