ArkTS入门:高性能移动开发新选择
目录一.场景导入二.学习目标三.学习任务任务 5.1初识ArkTS语言5.1.1 概述5.1.2 主要特性任务5.2 基础知识与构成5.2.1 基础知识5.2.2 函数5.2.3 类5.2.4 接口5.2.5泛型类型和函数5.2.6 空安全5.2.7 模块5.2.8关键字5.2.9 注解5.3 ArkTS编程规范5.3.1 概述5.3.2 命名5.3.3 格式5.3.4 编程实践四、实训指导五、项目小结一.场景导入移动时代呼唤更高性能、更低功耗的开发语言。传统 TypeScript 虽类型安全,却保留动态特性,在折叠屏、长列表、复杂动画等高负载场景易显卡顿。HarmonyOS 的默认语言 ArkTS 在 TS 生态之上收紧规则:强制静态类型、禁止运行时改对象布局、限制运算符语义、不支持结构化类型,使编译期即可算出内存结构,提前生成高效字节码并配合 AOT,实现秒级冷启动与 120Hz 稳定帧率。面对亲子画板、共享元素转场、折叠屏适配等交互密集需求,开发者可直接用同一套 ArkTS 代码完成从绘制命令、动画参数到多端布局的全部逻辑,无需编写 C++ 或 XML,真正做到“写一次,多端跑”。本项目带领学员在真实控件中体验类型系统、函数式闭包、泛型约束、空安全、注解与模块化等语言特性,建立“高性能源于强约束”的直观认知,为后续复杂 UI 框架、状态管理、渲染管线课程奠定语法基础。二.学习目标理解 ArkTS 与 TS/JS 的核心差异,能在编译期利用静态类型消除潜在空指针与布局变更风险。掌握强类型变量、常量、联合类型、枚举、数组、Record 等基础写法,可在画板颜色列表、路径命令等场景正确建模数据。熟悉函数声明、可选与 Rest 参数、箭头函数、闭包、重载,能够封装可复用的绘制算法与手势回调。理解类字段初始化、可见性修饰符、继承、接口、泛型约束,具备封装 DrawInvoker、Paint、DrawPath 等命令框架的能力。理解模块导出导入、注解语法、空安全运算符、异常与 finally 规范,能在多端项目中编写可维护、可调试、无隐性运行时开销的代码。培养学生严谨、细致、高效的职业态度和工匠精神。培养学生良好的职业习惯和工作规范。树立学生国产自主可控意识,培育科技创新精神。三.学习任务任务 5.1初识ArkTS语言5.1.1概述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是HarmonyOS应用的默认开发语言,在TypeScript(简称TS)生态基础上做了扩展,保持TS的基本风格。通过规范定义,从而强化了开发期的静态检查和分析,提升了程序执行的稳定性和性能,如图5-1所示。图5-1 ArkTS 更好的生产力与性能5.1.2主要特性自API version 10起,ArkTS进一步通过规范强化静态检查和分析,其主要特性及标准TS的差异概述如下:强制使用静态类型,静态类型是ArkTS最重要的特性之一。如果使用静态类型,那么程序中变量的类型就是确定的。同时,由于所有类型在程序实际运行前都是已知的,编译器可以验证代码的正确性,从而减少运行时的类型检查,有助于性能提升。禁止在运行时改变对象布局,为实现最优性能,ArkTS禁止在程序执行期间更改对象布局。限制运算符语义,为获得更好的性能并鼓励编写清晰的代码,ArkTS限制了部分运算符的语义。例如,一元加法运算符仅能作用于数字,不能用于其他类型变量。不支持Structural typing,对Structural typing的支持需要在语言、编译器和运行时进行大量的考虑和仔细的实现,当前ArkTS不支持该特性。根据实际场景的需求和反馈,后续会重新考虑是否支持Structural typing。ArkTS兼容TS/JavaScript(简称JS)生态,开发者可以使用TS/JS进行开发或复用已有代码。未来,ArkTS会结合应用开发/运行的需求持续演进,逐步增强并行和并发能力、扩展系统类型,以及引入分布式开发范式等更多特性。任务5.2 基础知识与构成5.2.1基础知识1.声明ArkTS通过声明引入变量、常量、类型和函数。变量声明,使用关键字let声明的变量可以在程序执行期间具有不同的值。代码如下:let hi: string = 'hello'; hi = 'hello, world';常量声明,使用关键字const声明的常量为只读类型,只能被赋值一次。代码如下:const hello: string = 'hello';对常量重新赋值会造成编译时错误。自动类型推断,如果变量或常量的声明包含初始值,开发者无需显式指定类型,因为ArkTS规范已列举了所有允许自动推断类型的场景。以下代码如下中,两条声明语句都是有效的,两个变量都是string类型:代码如下:let hi1: string = 'hello'; let hi2 = 'hello, world';2.类型基本类型和引用类型,基本数据类型包括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+157number类型在表示大整数(即超过-9007199254740991~9007199254740991)时会造成精度丢失。在开发时可以按需使用bigint类型来确保精度,代码如下:let bigInt: BigInt = BigInt('999999999999999999999999999999999999999999999999999999999999'); console.info('bigInt:' + bigInt.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 ClassT { //... } let instance: Class voidObject类型,Object类型是所有引用类型的基类型。任何值,包括基本类型的值,都可以直接被赋给Object类型的变量(基本类型值会被自动装箱)。Object类型用于表示除基本类型外的类型。代码如下:let o1: Object = 'Alice'; let o2: Object = ['a','b']; let o3: Object = 1;array类型,即数组,是由可赋值给数组声明中指定的元素类型的数据组成的对象。数组可由数组复合字面量赋值。数组复合字面量是用方括号括起来的零个或多个表达式列表,每个表达式为数组中的一个元素。数组的长度由数组中元素的个数确定。数组中第一个元素的索引为0。以下代码如下将创建包含三个元素的数组,代码如下:let names: string[] = ['Alice', 'Bob', 'Carol'];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类型,即联合类型,是由多个类型组合成的引用类型。联合类型包含了变量可能的所有类型。代码如下: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;3.运算符赋值运算符,赋值运算符=,使用方式如x=y。复合赋值运算符将赋值与运算符组合在一起,例如:a += b 等价于 a = a + b,其中的 += 即为复合赋值运算符。复合赋值运算符包括:+=、-=、*=、/=、%=、=、=、=、=、|=、^=。比较运算符见表5-1。表5-1 比较运算符运算符说明===如果两个操作数严格相等(对于不同类型的操作数认为是不相等的),则返回true。!==如果两个操作数严格不相等(对于不同类型的操作数认为是不相等的),则返回true。==如果两个操作数相等,则返回true。!=如果两个操作数不相等,则返回true。如果左操作数大于右操作数,则返回true。=如果左操作数大于或等于右操作数,则返回true。如果左操作数小于右操作数,则返回true。=如果左操作数小于或等于右操作数,则返回true。===与==的区别,代码如下:// ==只比较目标的值相等 console.info(String(null == undefined)); // true// ===比较目标的值和类型都相等 console.info(String(null === undefined)); // false算术运算符,一元运算符包括:-、+、--、++。二元运算符列举见表5-2。表5-2 二元运算符列举运算符说明+加法-减法*乘法/除法%除法后余数位运算符见表5-3。表5-3 位运算符