1# ArkCompiler子系统变更说明
2
3## cl.arkcompiler.1 ArkTS语法检查工具检查场景增加
4
5**访问级别**
6
7其他
8
9**变更原因**
10
11ArkTS语法检查工具的检查场景包括应用完整编译、增量编译、首次预览、首次热重载等,在预览和热重载场景下,增量修改代码保存后触发实时预览和热重载时,未进行ArkTS语法检查,本次变更在该场景下的编译流程中新增ArkTS语法检查,以和其他场景检查结果保持一致。
12
13**变更影响**
14
15变更前,在预览器和热重载场景下,增量修改再次预览和热重载时,不会进行ArkTS语法检查,如果引入违反ArkTS语法规则问题的代码,可以继续实时预览和热重载;变更后,在该场景下,如果引入违反ArkTS语法规则问题的代码,会阻塞编译,停止实时预览和热重载。
16
17**起始 API Level**
18
19ArkTS语法检查从API 10起启用。
20
21**变更发生版本**
22
23从OpenHarmony SDK 5.0.0.18 开始。
24
25**变更的接口/组件**
26
27不涉及。
28
29**适配指导**
30
31能够完整编译成功的应用,无需额外适配。
32
33
34## cl.arkcompiler.2 ArkTS Sendable语法规则编译检查规范化
35
36**访问级别**
37
38其他
39
40**变更原因**
41
42API 11中ArkTS语言规范首次引入@Sendable装饰器和Sendable class相关概念,但部分Sendable语法约束规则存在编译期未校验等问题。因此在本次版本更新中我们对ArkTS Sendable语法规则在编译期检查作规范化处理,旨在明确Sendable规范定义和限制场景,以更加清晰的规则指导开发者使用ArkTS Sendable特性进行开发。
43
44**变更影响**
45
46此变更为非兼容变更,本次更新中有如下Sendable语法规则约束新增和变更:
47
48#### 规则1. *Sendable class只能继承自Sendable class*
49
50现在我们对本规则场景进行完善,当Sendable class继承自变量(即使该变量赋值为Sendable class)时,编译报错。
51
52```ts
53@Sendable
54class A {}    // Sendable class
55
56let a = A
57
58@Sendable
59class B extends A {}
60
61@Sendable
62class C extends a {}    // 编译报错: Sendable class无法继承自变量
63```
64
65影响场景:Sendable class继承自变量场景(即使该变量赋值为Sendable class),在本次更新后将无法通过编译,存在兼容性影响
66
67---
68
69#### 规则2. *Non-sendable class只能继承自Non-sendable class*
70
71当Non-sendable class继承自Sendable class时,编译报错。
72
73```ts
74@Sendable
75class A {}
76
77class B extends A {}    // 编译报错: Non-sendable class无法继承自Sendable class
78```
79
80影响场景:当Non-sendable class继承自Sendable class时,原本在运行时报错,在本次更新后将无法通过编译,存在兼容性影响
81
82---
83
84#### 规则3. *泛型类中的Sendable class, collections.Array, collections.Map, collections.Set的模板类型必须是Sendable类型*
85
86现在编译期对Sendable类属性使用模板类型不再检查拦截,允许Sendable类属性使用模板类型;同时将检查泛型类在实例化位置的类型,当泛型类中的Sendable class的模板类型是Non-sendable类型时,编译报错。
87
88```ts
89@Sendable
90class B {}    // Sendable class
91
92@Sendable
93class C<T> {
94  v: T;    // 允许Sendable类属性使用模板类型,不再编译报错
95  constructor(v: T) {
96    this.v = v;
97  }
98}
99
100let c = new C<B>();
101
102function foo(a: C<B>) {}
103```
104
105```ts
106class B {}    // Non-sendable class
107
108@Sendable
109class C<T> {}
110
111let c = new C<B>();    // 编译报错:泛型类中的Sendable class的模板类型禁止为Non-sendable类型
112```
113
114影响场景:1. Sendable模板类属性使用模板类型场景,将不再编译报错;2.泛型类中的Sendable class的模板类型为Non-sendable类型的场景,在本次更新后将无法通过编译,存在兼容性影响
115
116---
117
118#### 规则4. *Sendable class禁止使用其他装饰器(类装饰器、属性装饰、方法装饰器、参数装饰器)*
119
120当Sendable class使用其他装饰器时,编译报错
121
122```ts
123// a.ts
124export function foo(a: Function) {
125  a.prototype = String
126}
127
128// b.ets
129import { foo } from 'a'
130
131@foo
132@Sendable
133class A {}    // 编译报错: Sendable class禁止使用其他装饰器
134```
135
136影响场景:对于Sendable class使用了其他装饰器,在本次更新后将无法通过编译,存在兼容性影响
137
138---
139
140#### 规则5. *禁止使用对象字面量或数组字面量初始化Sendable类型*
141
142现在当使用对象字面量或数组字面量初始化Sendable类型时,编译报错
143
144```ts
145@Sendable
146class C {}
147
148let c: C = {};    // 编译报错: 禁止使用对象字面量或数组字面量初始化Sendable类型
149```
150
151影响场景:使用对象字面量或数组字面量初始化Sendable类型的变量,在本次更新后将无法通过编译,存在兼容性影响
152
153---
154
155#### 规则6. *禁止使用as将Non-sendable类型强转成Sendable类型*
156
157现在当使用as将Non-sendable类型强转成Sendable类型时,编译报错
158
159```ts
160class A {}
161
162@Sendable
163class B {}
164
165function foo(a: A) {
166  a as B;    // 编译报错: 禁止使用as将Non-sendable类型强转成Sendable类型
167}
168```
169
170影响场景:强转后的Non-sendable类型的变量,在本次更新后将无法通过编译,存在兼容性影响
171
172---
173
174
175**起始 API Level**
176
177ArkTS语法检查从API 10起启用。
178
179**变更发生版本**
180
181从OpenHarmony SDK 5.0.0.18 开始。
182
183**变更的接口/组件**
184
185不涉及。
186
187**适配指导**
188
189存在上述规则影响场景的ArkTS代码需按照规范要求进行适配修改
190