HarmonyOS 编译阶段报错如下,不知道为何会有如此的报错。

编译阶段报错

Object literal must correspond to some explicitly declared class or interface (ArkTS-no-untyped-obj-literals) <ArkTSCheck> 

代码如下:

window: ArkTSFunModel = { 
  setTokenInfo: (tokenJson: string) => this.setTokenInfo(tokenJson), 
  routerPush: (page: string) => this.routerPush(page), 
  routerPushWeb: (url: string) => this.routerPushWeb(url), 
  __dcloud_weex_postMessage: (json: string) => this.postMessage(json) 
}; 
export interface ArkTSFunModel { 
  __dcloud_weex_postMessage: (json: string) => void; 
  setTokenInfo: (tokenJson: string) => void; 
  routerPush: (page: string) => void; 
  routerPushWeb: (url: string) => void; 
}

不知道为何会有如此的报错。

HarmonyOS
2024-08-27 10:30:03
浏览
收藏 0
回答 2
待解决
回答 2
按赞同
/
按时间
zxjiu

demo如下:

let window: ArkTSFunModel = { 
  setTokenInfo: (tokenJson: string):void => setTokenInfo(tokenJson), 
  routerPush: (page: string) :void=> routerPush(page), 
  routerPushWeb: (url: string):void => routerPushWeb(url), 
  __dcloud_weex_postMessage: (json: string):void => postMessage(json) 
}; 
function setTokenInfo(json:string){ 
  return 
} 
function routerPush(json:string){ 
  return 
} 
function routerPushWeb(json:string){ 
  return 
} 
function postMessage(json:string){ 
  return 
} 
export interface ArkTSFunModel { 
  __dcloud_weex_postMessage: (json: string) => void; 
  setTokenInfo: (tokenJson: string) => void; 
  routerPush: (page: string) => void; 
  routerPushWeb: (url: string) => void; 
} 
let PAGES_DICT = new Map<string, string>([['/pages/setting/setting', 'pages/Setting'], ['/pages/midPage/midPage', 'pages/Home']]); 
@Entry 
@Component 
struct Index { 
  @State message: string = 'Hello World'; 
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}

可以参考:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/arkts-more-cases.md#arkts-no-untyped-obj-literals里面介绍了一些规范。

分享
微博
QQ
微信
回复
2024-08-27 18:49:42
因为活着就一定行

可爱的开发者,你好


上面老师的回答非常到位,我在此基础上再详细解释一下。


首先,我们得知道这个问题是什么 Object literal must correspond to some explicitly declared class or interface (ArkTS-no-untyped-obj-literals) <ArkTSCheck> ,大白话就是“对象字面量必须对应于某个显式声明的类或接口”,进而我们就可以知道,是定义的字面量的问题


接口的分析

看了一下,定义一个叫做​​ArkTSFunModel​​的接口,我们一一看一下接口成员的情况:

  1. ​__dcloud_weex_postMessage​​:这个方法负责接收一个字符串参数,并处理发送消息的操作,但不返回任何结果。
  2. ​setTokenInfo​​:此方法接收一个字符串参数,用于设置令牌(Token)信息,同样不返回任何结果。
  3. ​routerPush​​:该方法通过接收一个字符串参数,实现页面跳转的逻辑,也不提供返回值。
  4. ​routerPushWeb​​:与routerPush类似,这个方法使应用能够根据提供的字符串参数在内部打开网页,同样没有返回值。


let window 初始化分析

注意,接口定义了四个方法构成了​ArkTSFunModel​接口的核心功能,他们均以void作为返回类型,即不返回任何数据。

所以你在初始化的时候,通过​this​关键字来引用封装自定义的方法,必须确保这些方法的实现与你在接口中定义的结构一致。这包括明确指定每个方法接收的参数数量、参数的类型以及是否有返回值。这样做是为了避免泛化定义,导致的编译错误。

window: ArkTSFunModel = {
    setTokenInfo: (tokenJson: string) => this.setTokenInfo(tokenJson),
    routerPush: (page: string) => this.routerPush(page),
    routerPushWeb: (url: string) => this.routerPushWeb(url),
    __dcloud_weex_postMessage: (json: string) => this.postMessage(json)
  };
  
setTokenInfo(json: string): void {
    return
  }

  routerPush(json: string): void {
    return
  }

  routerPushWeb(json: string): void {
    return
  }

  postMessage(json: string): void {
    return
  }
  
  
分享
微博
QQ
微信
回复
2024-08-28 06:17:22
相关问题
编译报错Found exception如下
384浏览 • 1回复 待解决
如下代码报错报错原因是什么?
153浏览 • 1回复 待解决
使用featureAbility.getContext()时报错如下
213浏览 • 1回复 待解决
ob有如何下报错,麻烦帮忙看一下?
4551浏览 • 1回复 待解决
开发自定义弹窗时报错如下
190浏览 • 1回复 待解决
在color.json文件中写注释报错如下
238浏览 • 1回复 待解决
openharmony 交叉编译openjdk报错
467浏览 • 1回复 待解决
编译报错没有堆栈信息
653浏览 • 1回复 待解决
HarmonyOS C++库使用aki库,编译报错
56浏览 • 1回复 待解决
下载编译Full-SDK报错
2056浏览 • 1回复 待解决
OpenHarmony 编译原生设置settings报错
2752浏览 • 0回复 待解决
搭建鸿蒙环境时,编译报错
12109浏览 • 4回复 待解决
初次安装DevEco Studio编译报错
7078浏览 • 1回复 待解决