">
当前位置:   article > 正文

Openharmony开发记录-从API9转API10的痛苦之路_for .. in" is not supported (arkts-no-for-in)

for .. in" is not supported (arkts-no-for-in)

Openharmony开发记录-从API9转API10的痛苦之路

由于业务需求更新的API前段时间写的APP需要更新到API10,记录在修改过程中发现的一系列问题

arkts-no-for-in

"for .. in" is not supported (arkts-no-for-in) <ArkTSCheck>

不支持for .. in

规则:arkts-no-for-in

级别:错误

由于在ArkTS中,对象布局在编译时是确定的、并且不能在运行时被改变,所以不支持使用for .. in迭代一个对象的属性。对于数组来说,可以使用常规的for循环。

应用代码

  1. interface Person {
  2. [name: string]: string
  3. }
  4. let p: Person = {
  5. name: 'tom',
  6. age: '18'
  7. };
  8. for (let t in p) {
  9. console.log(p[t]);
  10. }
  11. typescript

建议改法

  1. let p: Record<string, string> = {
  2. 'name': 'tom',
  3. 'age': '18'
  4. };
  5. for (let ele of Object.entries(p)) {
  6. console.log(ele[1]);
  7. }

 arkts-no-props-by-index

不支持通过索引访问字段

规则:arkts-no-props-by-index

级别:错误

ArkTS不支持动态声明字段,不支持动态访问字段。只能访问已在类中声明或者继承可见的字段,访问其他字段将会造成编译时错误。 使用点操作符访问字段,例如(obj.field),不支持索引访问(obj[field])。 ArkTS支持通过索引访问TypedArray(例如Int32Array)中的元素。

可以转换成Record类型,用来访问对象的属性。

应用代码

  1. import myRouter from '@ohos.router';
  2. let params: Object = myRouter.getParams();
  3. let funNum: number = params['funNum'];
  4. let target: string = params['target'];
  5. typescript

建议改法

  1. import myRouter from '@ohos.router';
  2. let params = myRouter.getParams() as Record<string, string | number>;
  3. let funNum: number = params.funNum as number;
  4. let target: string = params.target as string;

arkts-no-inferred-generic-params

需要显式标注泛型函数类型实参

规则:arkts-no-inferred-generic-params

级别:错误

如果可以从传递给泛型函数的参数中推断出具体类型,ArkTS允许省略泛型类型实参。否则,省略泛型类型实参会发生编译时错误。 禁止仅基于泛型函数返回类型推断泛型类型参数。

应用代码

  1. class A {
  2. str: string = ''
  3. }
  4. class B extends A {}
  5. class C extends A {}
  6. let arr: Array<A> = [];
  7. let originMenusMap:Map<string, C> = new Map(arr.map(item => [item.str, (item instanceof C) ? item: null]));
  8. typescript

建议改法

  1. class A {
  2. str: string = ''
  3. }
  4. class B extends A {}
  5. class C extends A {}
  6. let arr: Array<A> = [];
  7. let originMenusMap: Map<string, C | null> = new Map<string, C | null>(arr.map<[string, C | null]>(item => [item.str, (item instanceof C) ? item: null]));
  8. typescript

原因

(item instanceof C) ? item: null 需要声明类型为C | null,由于编译器无法推导出map的泛型类型参数,需要显式标注。

arkts-identifiers-as-prop-names

对象的属性名必须是合法的标识符

规则:arkts-identifiers-as-prop-names

级别:错误

在ArkTS中,对象的属性名不能为数字或字符串。通过属性名访问类的属性,通过数值索引访问数组元素。

应用代码

  1. interface W {
  2. bundleName: string
  3. action: string
  4. entities: string[]
  5. }
  6. let wantInfo: W = {
  7. 'bundleName': 'com.huawei.hmos.browser',
  8. 'action': 'ohos.want.action.viewData',
  9. 'entities': ['entity.system.browsable']
  10. }
  11. typescript

建议改法

  1. interface W {
  2. bundleName: string
  3. action: string
  4. entities: string[]
  5. }
  6. let wantInfo: W = {
  7. bundleName: 'com.huawei.hmos.browser',
  8. action: 'ohos.want.action.viewData',
  9. entities: ['entity.system.browsable']
  10. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/857916
推荐阅读
相关标签
  

闽ICP备14008679号