HarmonyOS鸿蒙Next中如何导出index.d.ts的枚举、接口等到index.ets,供其他模块使用

HarmonyOS鸿蒙Next中如何导出index.d.ts的枚举、接口等到index.ets,供其他模块使用 对于一个har, 内部实现了napi胶水层,目前已有index.d.ts, index.d.ts结构是一个命名空间,内有结构体,枚举、类、方法,如何全部导出到index.ets,

6 回复

1.在index.d.ts里面确定好要导出的内容

cke_587.png

2.在features/相应的包名/Index.ets里面统一导出index.d.ts的内容

cke_3745.png

参考文档:HSP-应用程序包开发与使用-应用程序包基础知识-开发基础知识-基础入门 - 华为HarmonyOS开发者

更多关于HarmonyOS鸿蒙Next中如何导出index.d.ts的枚举、接口等到index.ets,供其他模块使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙开发中,若要将通过napi实现的C++层接口通过index.d.ts命名空间结构导出到index.ets,可按照以下步骤实现:

一、声明文件与ArkTS导出的核心逻辑

1.index.d.ts声明规范

在.d.ts文件中定义命名空间(如NamespaceA),包含结构体、枚举、类和方法:

declare namespace NamespaceA {
  enum Status { Success, Error }
  interface Point { x: number; y: number }
  class MyClass { 
    constructor();
    method(): void;
  }
  function createInstance(): MyClass;
}

2.index.ets的导出方式

在HAR的index.ets中,需通过模块化语法重新导出命名空间内的所有元素:

// 导出整个命名空间(ArkTS 2.0+支持)
export * as NamespaceA from './path/to/napi_module';

// 或逐项导出(兼容性更佳)
import { Status, Point, MyClass, createInstance } from './path/to/napi_module';
export { Status, Point, MyClass, createInstance };

二、关键配置与注意事项

1.Native层napi绑定

  • 使用JSBIND_CLASS或napi_define_class将C++类映射到ArkTS环境:
JSBIND_CLASS(MyClass) {
  JSBIND_CONSTRUCTOR<>();
  JSBIND_METHOD(method);
}
  • 确保.cpp文件在CMakeLists.txt中被包含编译。

2.HAR构建配置

  • 在模块的build-profile.json5中配置Native依赖和路径映射:
{
  "arkOptions": {
    "runtimeOnly": {
      "sources": ["./src/main/ets/**/*.ts"],
      "packages": ["dependent_har_name"]
    }
  }
}

3.模块加载兼容性

  • 使用napi_load_module_with_info加载模块时,需确保路径前缀与moduleName匹配。
  • 若出现cppcrash,检查依赖是否完整添加。

三、特殊场景处理

  • 二次导出依赖HAR:

若当前HAR依赖另一个HAR(如b.har),可在index.ets中重新导出其命名空间:

import { SonHarUtils } from 'b_har_namespace';
export { SonHarUtils };
  • 类型兼容性

ArkTS不支持.d.ts的完整特性,需确保导出的接口类型与ArkTS类型系统兼容(如避免使用复杂泛型)。

四、验证导出结果

1.外部调用示例

在消费HAR的工程中,通过命名空间或直接导入使用:

import { NamespaceA } from 'your_har';
let point: NamespaceA.Point = { x: 1, y: 2 };
let instance = NamespaceA.createInstance();

2.日志调试

若调用失败,通过DevEco Studio的崩溃日志分析工具(如cppcrash堆栈解析)定位Native层问题。

在 HAR 模块的 oh-package.json5 中明确入口文件路径:

{
  "main": "index.ets",      // ArkTS入口文件
  "types": "index.d.ts"     // 类型声明文件
}

在 index.d.ts 中定义命名空间及类型(假设命名空间为 MyNative):

declare namespace MyNative {
  // 声明枚举
  enum Status { SUCCESS, ERROR }
  // 声明接口
  interface Result { code: number; message: string }
  // 声明Native方法
  function getResult(): Result;
}

在 index.ets 中导入 Native 方法并重新导出所有内容:

// 导入Native方法实现
import { getResult as nativeGetResult } from 'libnative.so';

// 导出枚举(需与Native层定义一致)
export enum Status {
  SUCCESS = 0,
  ERROR = 1
}

// 导出接口
export interface Result {
  code: number;
  message: string;
}

// 导出Native方法(适配ArkTS层)
export function getResult(): Result {
  return nativeGetResult();
}

外部模块引用 HAR 时,可直接导入接口

import { Status, Result, getResult } from 'your-har';

// 使用示例
let res: Result = getResult();
if (res.code === Status.SUCCESS) {
  console.info(res.message);
}

实现步骤:

1/在index.d.ts文件中定义命名空间及内部类型:

declare namespace MyNamespace {

  enum MyEnum { A, B }

  interface MyInterface { key: string }

  class MyClass { method(): void }

  function myFunc(): number;

}

2/在index.ets中通过重导出统一暴露接口

// 导出命名空间内的所有定义

export { MyNamespace } from './index.d.ts';

// 若需分模块导出,可合并其他文件定义

export * from './src/main/ets/utils/NativeUtils';

3/对于napi实现的Native方法,需在index.d.ts声明后,通过index.ets包装导出

// 调用Native方法示例

import native from 'libnative.so';

export function nativeAdd(a: number, b: number): number {

  return native.add(a, b);

}

4/在oh-package.json5中指定入口文件和类型声明路径:

{

  "main": "Index.ets",

  "types": "Index.d.ts"

}

在HarmonyOS鸿蒙Next中,使用index.d.ts定义枚举和接口后,通过index.ets直接导入即可使用。在index.ets中,使用import语句引入index.d.ts中导出的类型,例如:import { EnumName, InterfaceName } from './index'。确保两个文件在同一目录或正确配置路径。

在HarmonyOS Next中,可以通过以下步骤将index.d.ts中的命名空间、枚举、接口等类型导出到index.ets中供其他模块使用:

  1. 在index.ets中,使用export关键字直接导出index.d.ts中定义的类型。例如:
export { YourNamespace, YourEnum, YourInterface } from './index.d.ts';
  1. 如果index.d.ts使用命名空间,可以通过以下方式导出其内部成员:
export * as YourNamespace from './index.d.ts';
  1. 确保在需要使用这些类型的模块中正确导入:
import { YourNamespace, YourEnum } from 'your-har-package';

注意:需要确保har包的配置正确,并且在oh-package.json5中声明了正确的依赖关系。

回到顶部