1e41f4b71Sopenharmony_ci# ArkCompiler子系统变更说明
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci## cl.arkcompiler.1 TS编译的目标EcmaScript版本由ES2017切换至ES2021
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci**访问级别**
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci其他
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci**变更原因**
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ciOpenHarmony SDK中TypeScript Compiler的target选项配置由ES2017切换至ES2021。
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci**变更影响**
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ci对于极少数使用了部分ES2018-ES2021语法特性,但存在语法错误并添加`@ts-nocheck`或`@ts-ignore`注释的场景:
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci变更前,可以通过注释屏蔽语法错误,编译通过;
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ci变更后,由于对这部分语法的检查校验增强,可能存在不兼容编译报错。
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci
22e41f4b71Sopenharmony_ci**起始 API Level**
23e41f4b71Sopenharmony_ci
24e41f4b71Sopenharmony_ci9
25e41f4b71Sopenharmony_ci
26e41f4b71Sopenharmony_ci**变更发生版本**
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ciOpenHarmony SDK 5.0.0.19
29e41f4b71Sopenharmony_ci
30e41f4b71Sopenharmony_ci**变更的接口/组件**
31e41f4b71Sopenharmony_ci
32e41f4b71Sopenharmony_ci不涉及
33e41f4b71Sopenharmony_ci
34e41f4b71Sopenharmony_ci**适配指导**
35e41f4b71Sopenharmony_ci
36e41f4b71Sopenharmony_ci推荐删除`@ts-nocheck`和`@ts-ignore`注释,根据编译报错提示进行适配,例如:
37e41f4b71Sopenharmony_ci
38e41f4b71Sopenharmony_ci1. ES2018特性:Rest属性
39e41f4b71Sopenharmony_ci    ```
40e41f4b71Sopenharmony_ci    // @ts-ignore
41e41f4b71Sopenharmony_ci    const {a, ...remaning, b} = {a: 1, b: 2, c: 3, d: 4};
42e41f4b71Sopenharmony_ci    //           ~~~~~~~~
43e41f4b71Sopenharmony_ci    // 被注释屏蔽的报错:A rest element must be last in a destructuring pattern.
44e41f4b71Sopenharmony_ci    ```
45e41f4b71Sopenharmony_ci    适配建议:删除`@ts-ignore`注释,将rest属性放在最后。
46e41f4b71Sopenharmony_ci    ```
47e41f4b71Sopenharmony_ci    const {a, b, ...remaning} = {a: 1, b: 2, c: 3, d: 4};
48e41f4b71Sopenharmony_ci    ```
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ci2. ES2020特性:可选链式调用
51e41f4b71Sopenharmony_ci    ```
52e41f4b71Sopenharmony_ci    const object = { property: "hi" };
53e41f4b71Sopenharmony_ci    // @ts-ignore
54e41f4b71Sopenharmony_ci    object?.property = "hello";
55e41f4b71Sopenharmony_ci    // ~~~~~~~~~~~~~ 
56e41f4b71Sopenharmony_ci    // 被屏蔽的报错:The left-hand side of an assignment expression may not be an optional property access.
57e41f4b71Sopenharmony_ci    ```
58e41f4b71Sopenharmony_ci    适配建议:删除`@ts-ignore`注释,先对`object`进行判空,再进行赋值操作。
59e41f4b71Sopenharmony_ci    ```
60e41f4b71Sopenharmony_ci    const object = { property: "hi" };
61e41f4b71Sopenharmony_ci    if (object !== undefined) {
62e41f4b71Sopenharmony_ci        object.property = "hello";
63e41f4b71Sopenharmony_ci    }
64e41f4b71Sopenharmony_ci    ```
65e41f4b71Sopenharmony_ci
66e41f4b71Sopenharmony_ci3. ES2020特性:空值合并操作符
67e41f4b71Sopenharmony_ci    ```
68e41f4b71Sopenharmony_ci    // @ts-nocheck
69e41f4b71Sopenharmony_ci    let a = null || undefined ?? "foo";
70e41f4b71Sopenharmony_ci    //      ~~~~~~~~~~~~~~~~~
71e41f4b71Sopenharmony_ci    // 被屏蔽的报错:'||' and '??' operations cannot be mixed without parentheses.
72e41f4b71Sopenharmony_ci    let b = true && undefined ?? "foo";
73e41f4b71Sopenharmony_ci    //      ~~~~~~~~~~~~~~~~~
74e41f4b71Sopenharmony_ci    // 被屏蔽的报错:'&&' and '??' operations cannot be mixed without parentheses.
75e41f4b71Sopenharmony_ci    ```
76e41f4b71Sopenharmony_ci    适配建议:删除`@ts-nocheck`注释,加上括号以确保运算顺序符合预期。
77e41f4b71Sopenharmony_ci    ```
78e41f4b71Sopenharmony_ci    let a = (null || undefined) ?? "foo";
79e41f4b71Sopenharmony_ci    let b = (true && undefined) ?? "foo";
80e41f4b71Sopenharmony_ci    ```
81e41f4b71Sopenharmony_ci其他可能不兼容的场景同理,删除`@ts-nocheck`和`@ts-ignore`注释后根据编译报错提示修复即可。
82e41f4b71Sopenharmony_ci
83e41f4b71Sopenharmony_ci开发者也可在工程级别的build-profile.json5文件中配置targetESVersion为ES2017,来保持与变更前一致。