HarmonyOS 鸿蒙Next 原生应用开发-从TS到ArkTS的适配规则(二)
HarmonyOS 鸿蒙Next 原生应用开发-从TS到ArkTS的适配规则(二)
一、限制运算符的语义
为获得更好的性能并鼓励开发者编写更清晰的代码,ArkTS限制了一些运算符的语义。详细的语义限制。
示例
// 一元运算符+
只能作用于数值类型:
let t = +42; // 合法运算
let s = +‘42’; // 编译时错误
使用额外的语义重载语言运算符会增加语言规范的复杂度,而且,开发者还被迫牢记所有可能的例外情况及对应的处理规则。在某些情况下,产生一些不必要的运行时开销。
当前只有不到1%的代码库使用该特性。因此,尽管限制运算符的语义需要重构代码,但重构量很小且非常容易操作,并且,通过重构能使代码更清晰、具备更高性能。
二、不支持 structural typing
假设两个不相关的类T和U拥有相同的publicAPI:
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(); // 是否允许?
能把类型为T的值传递给接受类型为U的参数的函数吗?
function greeter(u: U) {
console.log('To ’ + u.name);
u.greet();
}
let t: T = new T();
greeter(t); // 是否允许?
换句话说,我们将采取下面哪种方法呢:
T和U没有继承关系或没有implements相同的接口,但由于它们具有相同的publicAPI,它们“在某种程度上是相等的”,所以上述两个问题的答案都是“是”;
T和U没有继承关系或没有implements相同的接口,应当始终被视为完全不同的类型,因此上述两个问题的答案都是“否”。
采用第一种方法的语言支持structural typing,而采用第二种方法的语言则不支持structural typing。目前TypeScript支持structural typing,而ArkTS不支持。
structural typing是否有助于生成清晰、易理解的代码,关于这一点并没有定论。那为什么ArkTS不支持structural typing呢?
因为对structural typing的支持是一个重大的特性,需要在语言规范、编译器和运行时进行大量的考虑和仔细的实现。另外,由于ArkTS使用静态类型,运行时为了支持这个特性需要额外的性能开销。
鉴于此,当前我们还不支持该特性。根据实际场景的需求和反馈,我们后续会重新加以考虑。
本文根据HarmonyOS NEXT Developer Beta1官方公开的开发文档整理而成。
关于HarmonyOS 鸿蒙Next 原生应用开发从TS到ArkTS的适配规则,以下是专业解答:
在HarmonyOS 鸿蒙Next的原生应用开发中,从TypeScript(TS)到ArkTS的适配涉及多个关键规则。
首先,ArkTS不支持使用#符号开头声明的私有字段。在TypeScript中,可能会看到类似#foo:number=42
的私有字段声明,但在ArkTS中,应改用private
关键字,如private foo:number=42
。
其次,类型(类、接口、枚举)和命名空间的命名必须唯一,且不能与其他名称(如变量名、函数名)冲突。例如,在TypeScript中,可能会不小心让类型的别名与变量同名,但在ArkTS中,这种命名冲突是不允许的。
再者,ArkTS推荐使用let
关键字来声明变量,而非var
。let
可以在块级作用域中声明变量,有助于避免潜在的错误。
这些规则是ArkTS为了确保类型安全和代码清晰性而设定的。遵循这些规则,将有助于开发者更高效地迁移到ArkTS,并开发出高质量的HarmonyOS原生应用。
如果开发者在适配过程中遇到具体问题,可以参考HarmonyOS NEXT Developer Beta1的官方开发文档,或者访问HarmonyOS开发者官网获取更多资源和支持。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。