HarmonyOS 鸿蒙Next ArkTS中interface匿名实现问题

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

HarmonyOS 鸿蒙Next ArkTS中interface匿名实现问题

cke_921.pngcke_1363.png

如图定义一个interface,让后如图二方式去实现它,报错Object literal must correspond to some explicitly declared class or interface (arkts-no-untyped-obj-literals)。

请问改如何改进实现方式?我需要在根据interface中回调的信息去更改UI的显示。

目标API 11

12 回复
接口的onError改成 onError: (errorCode: number) => void 就行

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

直接用Function,  我觉得TS里面的Fuction更像回调。

interface更多的时候实现,而非匿名实现,如果是匿名,一般支持的是interface里面只有属性,没有方法。

export interface ResultCallback {
  onResult(status: number, action: string, result: string): void;
}

private callback: ResultCallback = { //这一行语法报错 onResult: (status: number, action: string, result: string): void => { throw new Error(‘Function not implemented.’); } }

<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

报错Object literal must correspond to some explicitly declared class or interface (arkts-no-untyped-obj-literals)

到底要怎么写?

如果是为了回调用,可抛开Interface的形式,直接在类间或类与UI间传递xxx: Function 当作类似变量来用。 private callback: Function = (params…) => void; //相当于定义好了回调函数 this.callback(params…); //本类中调用方式 构造器 constructor(…, cb: Function) { …; this.callback = cb; } //构造时传递回调函数实现 在实现函数的地方,调用此带回调的类时,new Xxx(…, myFunc); //调用方传递回调的实现,注意实现时参数要对应。

这样的话,一个系列的回调,例如有6个,在传参的地方是不是要定义6遍。 例如 onLoaded,onError,onCompleted,onLoadError,onRenderError,onClick

原来 requestAd(callback: IRequestAdCallback) 现在要 requestAd(onLoaded:Function, onError:Function, onCompleted:Function, onLoadError:Function, onRenderError:Function, onClick:Function)

这样吗?

可以把回调合并为一个呀,用个参数指定回调类型,在回调中switch处理即可;

interface TestListener {
  onError(errCode: number): void;
}

class MyTest implements TestListener { onError(errCode: number): void { console.info(‘Method not implemented.errCode:’+errCode) } }

@Entry @Component struct Page89 { @State message: string = “测试” testListener: TestListener = new MyTest()

build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(() => { this.testListener.onError(33) }) } .width(‘100%’) } .height(‘100%’) } }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

你好,TestListener的用途正好跟您这个相反,我需要的是在UI界面去实现它,然后把它的实例注册到别的类,别的类通话调用onError把信息传递到UI

感谢老哥,eventHub可以解决我的问题

在HarmonyOS鸿蒙系统中,ArkTS框架主要支持TypeScript/JS开发,而传统Java或Kotlin中的interface概念在TypeScript中通常通过接口(interface)或类型别名(type alias)配合类(class)或对象字面量(object literals)来实现。

对于匿名实现,TypeScript本身不直接支持Java那样的匿名内部类实现接口。但你可以通过对象字面量来模拟这种行为,直接实现接口中定义的方法。例如:

interface MyInterface {
    myMethod(): void;
}

const myImplementation: MyInterface = {
    myMethod() {
        console.log('Method implemented');
    }
};

如果问题依旧没法解决请加我微信,我的微信是itying888。

回到顶部