HarmonyOS 鸿蒙Next 使用xx.d.ts导出接口并实现自定义对象入参

HarmonyOS 鸿蒙Next 使用xx.d.ts导出接口并实现自定义对象入参 使用xx.d.ts导出接口,其中接口的入参是若干自定义对象,该如何实现?
咨询场景描述:
使用d.ts方案导出接口,完成鸿蒙ts调用c++接口。
举例:需要入参传入自定义的User对象

export const getHistoryAsync: (a: User, b: number) => void;
2 回复

将接口定义为export const 接口名: (a: Object) =>返回值; 参考代码:

// ets
import hilog from '@ohos.hilog';
import testNapi from 'libentry.so';

export class testCb {
    testNum: number;
    testString: string;
}

export interface cb {
    // 回调一个string回TS
    onCallBack1(id: string): void;
    
    // 回调一个number回TS
    onCallBack2(cnt: number): void;
    
    // 回调一个类或者结构体回TS
    onCallBack3(cbClass: testCb): void;
}

class tsClass implements cb {
    public onCallBack1(id: string) {
        // 操作id
        console.log("testcallback1 " + id);
    }

    public onCallBack2(cnt: number) {
        // 操作number
        console.log("testcallback2 " + cnt);
    }

    public onCallBack3(cbClass: testCb) {
        // 操作cbClass
        console.log("testcallback3 " + cbClass.testNum);
    }
}

@Entry
@Component
struct Index {
    @State message: string = 'Hello World';

    build() {
        Row() {
            Column() {
                Text(this.message)
                    .fontSize(50)
                    .fontWeight(FontWeight.Bold)
                    .onClick(() => {
                        hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));
                        let tscb: tsClass = new tsClass();
                        testNapi.transobject(tscb);
                    })
                    .width('100%');
            }
            .height('100%');
        }
    }
}

// .cpp
static napi_value TransObject(napi_env env, napi_callback_info info) {
    napi_status status;
    size_t argc = 1;
    napi_value js_cb;

    status = napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr);
    assert(status == napi_ok);

    napi_value onCallBack1, str_arg;
    status = napi_get_named_property(env, js_cb, "onCallBack1", &onCallBack1);
    assert(status == napi_ok);

    status = napi_create_string_utf8(env, "mangguo", strlen("mangguo"), &str_arg);
    assert(status == napi_ok);

    size_t cb1argc = 1;
    status = napi_call_function(env, js_cb, onCallBack1, cb1argc, &str_arg, nullptr);

    size_t cb2argc = 1;
    napi_value onCallBack2, int_arg;
    status = napi_get_named_property(env, js_cb, "onCallBack2", &onCallBack2);
    status = napi_create_int32(env, 2, &int_arg);
    assert(status == napi_ok);

    status = napi_call_function(env, js_cb, onCallBack2, cb2argc, &int_arg, nullptr);
    assert(status == napi_ok);

    napi_value oncallback3, arg_object;
    status = napi_get_named_property(env, js_cb, "onCallBack3", &oncallback3);
    assert(status == napi_ok);

    status = napi_create_object(env, &arg_object);
    assert(status == napi_ok);

    napi_value testNum, testString;
    status = napi_create_int32(env, 123, &testNum);
    assert(status == napi_ok);

    status = napi_set_named_property(env, arg_object, "testNum", testNum);
    assert(status == napi_ok);

    status = napi_create_string_utf8(env, "mangguo", strlen("mangguo"), &testString);
    assert(status == napi_ok);

    status = napi_set_named_property(env, arg_object, "testString", testString);
    assert(status == napi_ok);

    status = napi_call_function(env, js_cb, oncallback3, cb2argc, &arg_object, nullptr);
    assert(status == napi_ok);

    return nullptr;
}

更多关于HarmonyOS 鸿蒙Next 使用xx.d.ts导出接口并实现自定义对象入参的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,使用.d.ts文件导出接口并实现自定义对象入参通常涉及到TypeScript的类型定义。以下是如何在鸿蒙应用中进行这一操作的简要说明:

  1. 创建.d.ts文件: 在你的项目中,创建一个.d.ts文件,用于声明你希望导出的接口。例如,创建一个名为interfaces.d.ts的文件。

  2. 定义接口: 在interfaces.d.ts文件中,定义你的接口。例如:

    export interface CustomObject {
        name: string;
        age: number;
    }
    
    export interface MyApi {
        myFunction(param: CustomObject): void;
    }
    
  3. 实现接口: 在你的TypeScript文件中,实现上述接口。例如:

    import { MyApi, CustomObject } from './interfaces';
    
    class ApiImpl implements MyApi {
        myFunction(param: CustomObject) {
            console.log(`Name: ${param.name}, Age: ${param.age}`);
        }
    }
    
    const api = new ApiImpl();
    api.myFunction({ name: 'John', age: 30 });
    

这样,你就成功地在鸿蒙系统中使用.d.ts文件导出了接口,并实现了带有自定义对象入参的函数。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部