随着鸿蒙操作系统的发展,ArkTS 作为其官方推荐的编程语言,逐渐受到大家的关注。,ArkTS这个魔改的TS语言,对于前端开发者来说无疑是福音,因为这意味着只需要极小的成本或者完全没有学习成本,可以直接无缝开发鸿蒙Next应用。

本文将详细介绍如何将TypeScript代码适配到ArkTS,并提供详细的适配规则,帮助大家更加顺利完成从前端到鸿蒙的过渡迁移。

一、ArkTS简介

ArkTS是鸿蒙操作系统推出的一种静态类型编程语言,基于TypeScript并进行了诸多优化和改进。ArkTS不仅保留了TypeScript的大部分语法特性,还引入了一系列新的特性和约束,以提升性能和开发效率。

二、适配规则

2.1 强制使用静态类型

ArkTS强制要求所有类型在编译时已知,禁止使用any和unknown类型。这有助于提升代码的可读性和可维护性,同时减少运行时错误。

// TypeScript
let res: any = some_api_function('hello', 'world');
// ArkTS
class CallResult {
public succeeded(): boolean { ... }
public errorMessage(): string { ... }
}
let res: CallResult = some_api_function('hello', 'world');

2.2 禁止在运行时变更对象布局

ArkTS要求对象的布局在编译时确定,并在运行时不可更改。这包括禁止添加、删除属性和方法,以及禁止将任意类型的值赋值给对象属性。

在ArkTS中,严格类型检查不是可配置项。ArkTS强制进行部分严格类型检查,并通过规范禁止使用any类型,禁止在代码中使用@ts-ignore。

// TypeScript
class Point {
x: number = 0;
y: number = 0;
}
let p1 = new Point();
delete p1.x; // 编译时错误
// ArkTS
class Point {
x: number = 0;
y: number = 0;
}
let p1 = new Point();
// delete p1.x; // 编译时错误

2.3 限制运算符的语义

ArkTS限制了一元运算符+、-和~仅适用于数值类型,禁止隐式将字符串转换为数值。

// TypeScript
let a = +5; // 合法
let b = +'5'; // 编译时错误
// ArkTS
let a = +5; // 合法
// let b = +'5'; // 编译时错误

2.4 不支持structural typing

ArkTS不支持structural typing,要求类型必须显式声明,禁止通过接口实现 structural typing。

// TypeScript
interface I1 { f(): string }
interface I2 { f(): string }
class X implements I1, I2 { f() { return 'foo'; } }
// ArkTS
interface I1 { f(): string }
interface I2 { f(): string }
class X implements I1, I2 { f() { return 'foo'; } }

structural typing是否有助于生成清晰、易理解的代码,关于这一点并没有定论。那为什么ArkTS不支持structural typing呢?

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

2.5 其他重要规则

  • 对象的属性名必须是合法的标识符:ArkTS不允许对象属性名为数字或字符串。
  • 不支持Symbol() API:ArkTS不支持动态生成唯一属性名称。
  • 不支持以#开头的私有字段:改用private关键字。
  • 类型、命名空间的命名必须唯一:避免名称冲突。
  • 使用let而非var:提升代码的可读性和安全性。
  • 不支持any和unknown类型:显式标注具体类型。
  • 不支持类表达式:必须显式声明一个类。
  • 类不允许implements:只有接口可以被implements。
  • 不支持修改对象的方法:禁止动态修改对象方法。
  • 类型转换仅支持as T语法:禁止使用语法。
  • 不支持JSX表达式:ArkTS不支持JSX。
  • 不支持new.target:ArkTS没有原型的概念。
  • 不支持确定赋值断言:改为在声明变量的同时为变量赋值。
  • 不支持在原型上赋值:ArkTS没有原型的概念。
  • 不支持globalThis:ArkTS不支持全局作用域。
  • 不支持一些utility类型:仅支持Partial、Required、Readonly和Record。
  • 不支持对函数声明属性:禁止动态改变函数对象布局。
  • 不支持Function.apply和Function.call:禁止使用标准库函数。
  • 不支持Function.bind:禁止使用标准库函数。
  • 不支持as const断言:ArkTS不支持字面量类型。
  • 不支持导入断言:ArkTS不支持导入断言。
  • 限制使用标准库:禁止使用TypeScript或JavaScript标准库中的某些接口。
  • 强制进行严格类型检查:包括noImplicitReturns、strictFunctionTypes等。
  • 不允许通过注释关闭类型检查:类型检查是强制性的。
  • 允许.ets文件import.ets/.ts/.js文件源码,不允许.ts/.js文件import.ets文件源码:确保类型安全。
  • 类不能被用作对象:类声明的是一个新的类型,不是一个值。
  • 不支持在import语句前使用其他语句:所有import语句需要放在所有其他语句之前。
  • 限制使用ESObject类型:防止动态对象在静态代码中的滥用。

三、总结

ArkTS作为鸿蒙NEXT的重要组成部分,通过一系列严格的适配规则,确保了代码的性能和安全性。尽管这些规则可能会带来一定的迁移和学习成本,但长远来看,它们将有助于提升开发效率和代码质量。

希望本文能为大家提供有价值的参考,助力大家顺利从前端过渡到ArkTS的开发环境。

通过遵循上述规则和建议,开发者可以有效地将TypeScript代码转换为ArkTS,并充分利用ArkTS的优势,开发出更高效、更安全的鸿蒙next应用。

posted on   纯爱掌门人  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示