HarmonyOS鸿蒙Next中ArkTS如何调用JavaScript代码(非web)

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS鸿蒙Next中ArkTS如何调用JavaScript代码(非web) 项目中有些算法代码是JavaScript写的,想着可以直接拷过来复用,让arkts调用这些js代码(不通过web而是直接调用)。

比如我有js代码中有类Geometry:

export class Geometry {
   getArea() {
    return 0.1
  }
}

arkts代码中有Polygon_类:

import { Geometry } from "js_library";

export class Polygon_ extends Geometry {

  cal(): number {
    return this.getArea() * 2
  }
  
  //这里必须重写??
  getArea(): number {
    return super.getArea();
  }
}

我发现在Polygon_中必须重写getArea,不然会编译报错:Property ‘getArea’ does not exist on type ‘Polygon_’。

所以arkts直接调用js有什么详细的规则和限制吗?


更多关于HarmonyOS鸿蒙Next中ArkTS如何调用JavaScript代码(非web)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复
先说解决方法:

```javascript
export class Polygon_ extends Geometry {
  cal(): number {
    return this.getArea() * 2
  }

  // 必须重新声明,以便ArkTS编译器了解方法类型
  getArea(): number {
    return super.getArea(); // 实际调用JS父类的实现
  }
}

ArkTS与JavaScript的交互存在一些特殊规则和限制,这就是为什么您在继承JavaScript类时遇到了问题。问题的核心在于ArkTS对类型系统的严格要求:

  • ArkTS是强类型语言,编译为方舟字节码而非JavaScript
  • ArkTS强制要求类的属性在声明或构造函数中显式初始化
  • ArkTS对空值和未定义值有更严格的检查

继承JS类的特殊处理:

当您的Polygon_类继承自JavaScript中的Geometry类时,ArkTS无法自动识别Geometry类中的getArea()方法,因为:

  • JavaScript是动态类型,方法定义对ArkTS不完全可见
  • ArkTS的编译器无法确定继承自JS类的方法类型信息

解决方案:

  • 必须在子类中重新声明从JS父类继承的所有方法,以提供明确的类型信息
  • 使用super调用实际实现

正确的做法是像您已经做的那样,在Polygon_类中重新声明getArea()方法:

更多关于HarmonyOS鸿蒙Next中ArkTS如何调用JavaScript代码(非web)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢回复。请问您说的这些关于arkts调用js的规则和约束有相关的文档可以参考吗,我找了一圈没有找到,

在HarmonyOS鸿蒙Next中,ArkTS可以通过import语句直接调用JavaScript代码。具体步骤如下:

  1. 创建JavaScript文件:首先,创建一个JavaScript文件,例如example.js,并在其中定义需要调用的函数或变量。

  2. 导出功能:在example.js中使用export语句导出需要调用的函数或变量。

  3. 在ArkTS中导入:在ArkTS文件中使用import语句导入JavaScript文件中的功能。

  4. 调用JavaScript代码:在ArkTS中直接调用导入的JavaScript函数或变量。

代码示例:

// example.js
export function sayHello() {
    return "Hello from JavaScript!";
}
// example.ets
import { sayHello } from './example.js';

function callJsFunction() {
    let message = sayHello();
    console.log(message); // 输出: Hello from JavaScript!
}

通过这种方式,ArkTS可以直接调用非Web环境下的JavaScript代码。

在HarmonyOS鸿蒙Next中,ArkTS可以通过@ohos.worker模块调用JavaScript代码。具体步骤如下:

  1. 创建Worker:在ArkTS中创建一个Worker对象,指定JavaScript文件路径。
  2. 发送消息:通过postMessage方法向Worker发送消息。
  3. 接收消息:在Worker中处理消息并通过postMessage返回结果。
  4. 监听消息:在ArkTS中通过onmessage事件监听Worker返回的消息。

示例:

// ArkTS
const worker = new Worker('workers/example.js');
worker.postMessage('Hello from ArkTS');
worker.onmessage = (event) => {
  console.log('Received from JS:', event.data);
};

// workers/example.js
self.onmessage = (event) => {
  self.postMessage('Hello from JavaScript');
};

这种方式适用于非Web场景下的ArkTS与JavaScript交互。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!