当前位置:   article > 正文

HarmonyOS实战开发:ArkTS语法适配

HarmonyOS实战开发:ArkTS语法适配

ArkTS在保持TypeScript(简称TS)基本语法风格的基础上,进一步通过规范强化静态检查和分析,使得在程序开发期能检测更多错误,提升程序稳定性,并实现更好的运行性能。本文将进一步解释为什么建议将TS代码适配为ArkTS代码。

程序稳定性

动态类型语言,例如JavaScript(简称JS),可以使得开发者非常快速地编写代码,但是同时,它也使得程序容易在运行时产生非预期的错误。例如在代码中,如果开发者没有检查一个值是否为,那么程序有可能在运行时崩溃,给开发者造成不便。如果能在代码开发阶段检查此类问题是更有好处的。TS通过标注类型帮助开发者检查错误,许多错误在编译时可以被编译器检测出来,不用等到程序运行时。但是,即使是TS也有局限性,它不强制要求对变量进行类型标注,导致很多编译时检查无法开展。ArkTS尝试克服这些缺点,它强制使用静态类型,旨在通过更严格的类型检查以减少运行时错误。undefined

程序性能

为了保证程序的正确性,动态类型语言不得不在运行时检查对象的类型。例如,JS不允许访问的属性。但是检查一个值是否为的唯一的办法是在运行时进行一次类型检查。所有的JS引擎都会做如下的事:如果一个值不是,那么可以访问其属性,否则抛出异常。现代JS引擎可以很好地对这类操作进行优化,但是总有一些检查是无法被消除的,这就使得程序变慢了。由于TS总是先被编译成JS,所以在TS代码中,也会面临相同的问题。ArkTS解决了这个问题。由于使能了静态类型检查,ArkTS代码将会被编译成某种可执行的字节码文件,而不是JS代码。因此,ArkTS运行速度更快,更容易被进一步地优化。undefinedundefinedundefined

下面通过一些例子解释为什么ArkTS可以帮助提升程序的稳定性和性能。

显式初始化类的属性

ArkTS要求类的所有属性在声明时或者在构造函数中显式地初始化。这和TS中的模式一致。 strictPropertyInitialization

来看以下的TS代码:

  1. class Person {
  2. name: string // undefined
  3. setName(n: string): void {
  4. this.name = n
  5. }
  6. getName(): string {
  7. // 开发者使用"string"作为返回类型,这隐藏了name可能为"undefined"的事实。
  8. // 更合适的做法是将返回类型标注为"string | undefined",以告诉开发者这个API所有可能的返回值的类型。
  9. return this.name
  10. }
  11. }
  12. let buddy = new Person()
  13. // 假设代码中没有对name的赋值,例如没有调用"buddy.setName('John')"
  14. console.log(buddy.getName().length); // 运行时异常:name is undefined

由于ArkTS要求属性显式初始化,代码应该像下面这样写。

  1. class Person {
  2. name: string = ''
  3. setName(n: string): void {
  4. this.name = n
  5. }
  6. // 类型为"string",不可能为"null"或者"undefined"
  7. getName(): string {
  8. return this.name
  9. }
  10. }
  11. let buddy = new Person()
  12. // 假设代码中没有对name的赋值,例如没有调用"buddy.setName('John')"
  13. console.log(buddy.getName().length); // 0, 没有运行时异常

如果可以是,那么它的类型应该在代码中被精确地标注。nameundefined

  1. class Person {
  2. name?: string // 可能为undefined
  3. setName(n: string): void {
  4. this.name = n
  5. }
  6. // 编译时错误:name可能为"undefined",所以不能将这个API的返回类型标注为"string"
  7. getNameWrong(): string {
  8. return this.name
  9. }
  10. getName(): string | undefined { // 返回类型匹配name的类型
  11. return this.name
  12. }
  13. }
  14. let buddy = new Person()
  15. // 假设代码中没有对name的赋值,例如没有调用"buddy.setName('John')"
  16. // 编译时错误:编译器认为下一行代码有可能访问"undefined"的属性,报错
  17. console.log(buddy.getName().length); // 编译失败
  18. console.log(buddy.getName()?.length); // 编译成功,没有运行时错误

这个例子展示了ArkTS是如何通过强制更严格的类型检查来提高代码稳定性和正确性的。

Null Safety

再来看一个例子。

  1. function notify(who: string, what: string) {
  2. console.log(`Dear ${who}, a message for you: ${what}`)
  3. }
  4. notify('Jack', 'You look great today')

在大多数情况下,函数会接受两个类型的变量作为输入,产生一个新的字符串。但是,如果将一些特殊值作为输入,例如,情况会怎么样呢? 程序仍会正常运行,输出预期值:。一切看起来正常,但是请注意,为了保证该场景下程序的正确性,引擎总是在运行时进行类型检查,执行类似以下的伪代码。notifystringnotify(null, undefined)Dear undefined, a message for you: null

  1. function __internal_tostring(s: any): string {
  2. if (typeof s === 'string')
  3. return s
  4. if (s === undefined)
  5. return 'undefined'
  6. if (s === null)
  7. return 'null'
  8. // ...
  9. }

现在想象一下,如果函数是某些复杂的负载场景中的一部分,而不仅仅是打印日志,那么在运行时执行像的类型检查将会是一个性能问题。notify__internal_tostring

如果可以保证在运行时,只有类型的值(不会是其他值,例如或者)可以被传入函数呢?在这种情况下,因为可以确保没有其他边界情况,像的检查就是多余的了。对于这个场景,这样的机制叫做“null-safety”,也就是说,保证不是一个合法的类型变量的值。如果ArkTS有了这个特性,类型不符合的代码将无法编译。stringnullundefinednotify__internal_tostringnullstring

  1. function notify(who: string, what: string) {
  2. console.log(`Dear ${who}, a message for you: ${what}`)
  3. }
  4. notify('Jack', 'You look great today')
  5. notify(null, undefined) // 编译时错误

TS通过打开编译选项来实现此特性。但是TS是被编译成JS的,而JS没有这个特性,因此严格检查只在编译时起作用。从程序稳定性和性能角度考虑,ArkTS将“null-safety”视为一个重要的特性。这就是为什么ArkTS强制进行严格检查,在ArkTS中,上面的代码总是编译报错。作为交换,这样的代码可以给ArkTS引擎带来更多的信息和有关值的类型保证,这有助于更好地优化性能。strictNullChecksnullnull

.ets代码兼容性

在API version 10之前,ArkTS(.ets文件)完全采用了标准TS的语法。从API version 10 Release起,ArkTS的语法规则基于上述设计考虑进行了明确定义,同时,SDK增加了在编译流程中对.ets文件的ArkTS语法检查,通过编译告警或编译失败提示开发者适配新的ArkTS语法。

根据工程的compatibleSdkVersion,具体策略如下:

  • compatibleSdkVersion >= 10 为标准模式。在该模式下,对.ets文件,违反ArkTS语法规则的代码会导致工程编译失败,需要完全适配ArkTS语法后方可编译成功。
  • compatibleSdkVersion < 10 为兼容模式。在该模式下,对.ets文件,以warning形式提示违反ArkTS语法规则的所有代码。尽管违反ArkTS语法规则的工程在兼容模式下仍可编译成功,但是需要完全适配ArkTS语法后方可在标准模式下编译成功。

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/476481
推荐阅读
相关标签
  

闽ICP备14008679号