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