22-ArkTs 常见错误

22-ArkTs 常见错误

arkts-no-side-effects-imports

改用动态import

应用代码

import 'module'

建议改法

import('module')

arkts-no-func-props

应用代码

function foo(value: number): void {  console.log(value.toString());}
foo.add = (left: number, right: number) => {  return left + right;}
foo.sub = (left: number, right: number) => {  return left - right;}

建议改法

class Foo {  static foo(value: number): void {    console.log(value.toString());  }
  static add(left: number, right: number): number {    return left + right;  }
  static sub(left: number, right: number): number {    return left - right;  }}

arkts-limited-esobj

应用代码

// lib.d.tsdeclare function foo(): any;
// main.etslet e0: ESObject = foo();
function f() {  let e1 = foo();  let e2: ESObject = 1;  let e3: ESObject = {};  let e4: ESObject = '';}

建议改法

// lib.d.tsdeclare function foo(): any;
// main.etsinterface I {}
function f() {  let e0: ESObject = foo();  let e1: ESObject = foo();  let e2: number = 1;  let e3: I = {};  let e4: string = '';}

拷贝

浅拷贝

TypeScript

function shallowCopy(obj: object): object {  let newObj = {};  Object.assign(newObj, obj);  return newObj;}

ArkTS

function shallowCopy(obj: object): object {  let newObj: Record<string, Object> = {};  for (let key of Object.keys(obj)) {    newObj[key] = obj[key];  }  return newObj;}

深拷贝

TypeScript

function deepCopy(obj: object): object {  let newObj = Array.isArray(obj) ? [] : {};  for (let key in obj) {    if (typeof obj[key] === 'object') {      newObj[key] = deepCopy(obj[key]);    } else {      newObj[key] = obj[key];    }  }  return newObj;}

ArkTS

function deepCopy(obj: object): object {  let newObj: Record<string, Object> | Object[] = Array.isArray(obj) ? [] : {};  for (let key of Object.keys(obj)) {    if (typeof obj[key] === 'object') {      newObj[key] = deepCopy(obj[key]);    } else {      newObj[key] = obj[key];    }  }  return newObj;}

状态管理使用典型场景

Struct组件外使用状态变量

由于struct和class不同,不建议把this作为参数传递到struct外部使用,避免引起实例引用无法释放的情况,导致内存泄露。建议将状态变量对象传递到struct外面使用,通过修改对象的属性,来触发UI刷新。

不推荐用法

export class MyComponentController {  item: MyComponent = null;
  setItem(item: MyComponent) {    this.item = item;  }
  changeText(value: string) {    this.item.value = value;  }}
@Componentexport default struct MyComponent {  public controller: MyComponentController = null;  @State value: string = 'Hello World';
  build() {    Column() {      Text(this.value)        .fontSize(50)    }  }
  aboutToAppear() {    if (this.controller)      this.controller.setItem(this); // 不建议把this作为参数传递到struct外部使用  }}
@Entry@Componentstruct ObjThisOldPage {  controller = new MyComponentController();
  build() {    Column() {      MyComponent({ controller: this.controller })      Button('change value').onClick(() => {        this.controller.changeText('Text');      })    }  }}

推荐用法

class CC {  value: string = '1';
  constructor(value: string) {    this.value = value;  }}
export class MyComponentController {  item: CC = new CC('1');
  setItem(item: CC) {    this.item = item;  }
  changeText(value: string) {    this.item.value = value;  }}
@Componentexport default struct MyComponent {  public controller: MyComponentController | null = null;  @State value: CC = new CC('Hello World');
  build() {    Column() {      Text(`${this.value.value}`)        .fontSize(50)    }  }
  aboutToAppear() {    if (this.controller)      this.controller.setItem(this.value);  }}
@Entry@Componentstruct StyleExample {  controller: MyComponentController = new MyComponentController();
  build() {    Column() {      MyComponent({ controller: this.controller })      Button('change value').onClick(() => {        this.controller.changeText('Text');      })    }  }}

Struct支持联合类型的方案

下面这段代码有arkts-no-any-unknown的报错,由于struct不支持泛型,建议使用联合类型,实现自定义组件类似泛型的功能。

不推荐用法

class Data {  aa: number = 11;}
@Entry@Componentstruct DatauionOldPage {  @State array: Data[] = [new Data(), new Data(), new Data()];
  @Builder  componentCloser(data: Data) {    Text(data.aa + '').fontSize(50)  }
  build() {    Row() {      Column() {        ForEachCom({ arrayList: this.array, closer: this.componentCloser })      }      .width('100%')    }    .height('100%')  }}
@Componentexport struct ForEachCom {  arrayList: any[]; // struct不支持泛型,有arkts-no-any-unknown报错  @BuilderParam closer: (data: any) => void = this.componentCloser; // struct不支持泛型,有arkts-no-any-unknown报错
  @Builder  componentCloser() {  }
  build() {    Column() {      ForEach(this.arrayList, (item: any) => { // struct不支持泛型,有arkts-no-any-unknown报错        Row() {          this.closer(item)        }.width('100%').height(200).backgroundColor('#eee')      })    }  }}

推荐用法

class Data {  aa: number = 11;}
class Model {  aa: string = '11';}
type UnionData = Data | Model;
@Entry@Componentstruct DatauionPage {  array: UnionData[] = [new Data(), new Data(), new Data()];
  @Builder  componentCloser(data: UnionData) {    if (data instanceof Data) {      Text(data.aa + '').fontSize(50)    }  }
  build() {    Row() {      Column() {        ForEachCom({ arrayList: this.array, closer: this.componentCloser })      }      .width('100%')    }    .height('100%')  }}
@Componentexport struct ForEachCom {  arrayList: UnionData[] = [new Data(), new Data(), new Data()];  @BuilderParam closer: (data: UnionData) => void = this.componentCloser;
  @Builder  componentCloser() {  }
  build() {    Column() {      ForEach(this.arrayList, (item: UnionData) => {        Row() {          this.closer(item)        }.width('100%').height(200).backgroundColor('#eee')      })    }  }}
### 关于 ArkTS 标准库使用限制 ArkTS 是基于 TypeScript 扩展而来的一种编程语言,在 HarmonyOS 平台上具有特定的应用场景。尽管大部分 TypeScript 的语法和标准库功能可以在 ArkTS 中正常使用,然而由于 HarmonyOS 平台的独特性质,某些标准库的功能可能会受到限制或者不完全兼容[^2]。 这些限制主要体现在以下几个方面: - **API 可用性**:并非所有的 JavaScript/TypeScript API 都能在 ArkTS 环境下运行良好; - **性能优化**:为了适应移动设备资源有限的特点,一些高消耗的操作被禁用了; - **安全考量**:出于安全性考虑,部分可能导致安全隐患的标准库方法也被屏蔽掉了; 当开发者遇到 `arkts-limited-stdlib` 类型的错误提示时,通常意味着当前尝试调用的方法或属性并不适用于该环境下的 ArkTS 版本。 ### 处理 arkts-limited-stdlib 错误解决方案 对于此类问题的一个有效解决办法是在项目配置文件中调整依赖项版本号来匹配最新的 SDK 或者适配器包。具体操作如下所示: 如果正在使用的 Deveco Studio 工具链出现了上述提到的问题,则可以通过更新工具链至最新稳定版的方式解决问题。此外,还可以通过修改项目的 tsconfig.json 文件中的 compilerOptions 来指定更合适的 lib 字段值,从而避开那些不受支持的部分[^1]。 ```json { "compilerOptions": { ... "lib": ["esnext", "dom"], ... } } ``` 另外一种常见的做法就是寻找官方文档提供的替代实现方式或者是社区贡献的相关 polyfill 库来进行补充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万少-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值