目录
ArkTs
鸿蒙开发使用的语言,Typescript语言的超集。跟ts一样是静类型态语言,所有数据的类型都必须在编译时确定。文件以ets后缀结尾。在ts的基础上加入了结构体struct的定义以及一些定义好了的UI组件和装饰器。基本语法和ts一致。
基础语法介绍
语法差别
总体语法和Typescript的基本一致,主要区别在于
1.添加了一些限制去明确类型,例如不支持泛型、常量使用需要标注类型以及this使用等限制。
2.限制了类型、接口的灵活写法,比如接口不能直接定义函数、不能通过[]定义对象属性等,推荐大家使用Typescript中定义好的一些类型函数,例如Record<>等。
3.简化了一些类型定义流程,例如构造函数类型定义去除了new操作符等。
4.限制了操作符等一些灵活的写法,比如禁止使用in、for in、apply、call等操作符和函数。
具体案例
不支持通过注释类型检查。
ArkTS不支持通过注释的方式绕过严格类型检查。首先将注释(// @ts-nocheck或者// @ts-ignore)删去,再根据报错信息修改其他代码。
对象字面量须标注类型
原因:如果编译器不知道变量point的确切类型,由于对象布局不能确定,编译器无法深度地优化这段代码,造成性能瓶颈。没有类型也会造成属性的类型缺少限制,例如point.x的类型在此时为number,它也可以被赋值成其他类型,造成额外的运行时检查和开销。
注意只有对象字面量需要标注类型,基础变量是不需要的,会隐式的进行类型推断。
let point = { x: 0,y: 0} //编译时报错,需要标注类型
Interface Point {
x: number,
y: number
}
let point:Point = { x: 0,y: 0} // 不会报错
let hi = 'hello, world'; //不会报错
显示初始化类的属性
类的属性初始化赋值或者在构造函数里赋值。相当于设置了tsconfig.json中的strictPropertyInitialization为true。
class Person {
name: string; // 这里arkts类型检测会报错,需要显性进行赋值。
}
new Person()//name为undefined
// 正确
class Person1 {
name: string='';
}
interface I {
name:string
}
class A {}
class Test {
a: number;
b: string;
c: boolean;
d: I = { name:'abc' };
e: A | null = null;
constructor(a:number, b:string, c:boolean) {
this.a = a;
this.b = b;
this.c = c;
}
}
不支持Structural Typing
Structural Typing是一种类型系统,它允许根据对象的结构(属性和方法)而不是其类型来处理对象。
注意:规定类型为C,C的子集是可以传入的,C的父集不行。
class C{
s:string = ''
}
class D{
n:number=0
s:string = ''
}
function foo(c:C){
console.log(c.s)
}
foo(new D()) // 在arkts中编译会报错,不允许传入其他类型的变量,即使这个类型的属性满足要求。
原因:foo虽然声明参数类型是C,但也可以传递类型D的变量,这种灵活性可能不符合开发者的意图,容易带来程序行为的正确性问题。另外,由于类型D和类型C布局不同,那么foo中对c.s这个属性访问就不能被优化成根据固定偏移量访问的方式,从而给运行时性能造成瓶颈。
不支持Symbol()API
TypeScript中的Symbol()API用于在运行时生成唯一的属性名称。由于该API的常见使用场景在静态类型语言中没有意义,因此,ArkTS不支持Symbol()API。在ArkTS中,对象布局在编译时就确定了,且不能在运行时被更改。
ArkTS只支持Symbol.iterator。
禁止使用var声明变量
禁止使用any和unknow约束类型
类型、命名空间的命名必须唯一
// 错误
let X: string
type X = number[] // 类型的别名与变量同名,报错
允许json中的科学技术法数字格式
标准TS/JS中,JSON的数字格式,小数点后必须跟着数字,如2.e3这类科学计数法不被允许,报出SyntaxError。在方舟运行时中,允许使用这类科学计数法。
应用环境限制
- 强制使用严格模式(use strict)
- 禁止使用eval()
- 禁止使用with() {}
- 禁止以字符串为代码创建函数
this使用
- 关键字this只能在类的实例方法中使用(在函数和类的静态方法中无法使用)。