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
回答 3
待解决
回答 3
按赞同
/
按时间
鱼弦CTO
1

在 HarmonyOS 的 ArkTS 中,出现 ​​ArkTS-no-untyped-obj-literals​​​ 错误,通常是因为对象字面量赋值时没有类型注解或接口的显式声明。根据你的描述和提供的代码,问题出现在你为 ​​window​​ 变量分配一个对象字面量时没有明确指定其类型。

为了确保对象字面量符合指定的接口类型,你需要明确地将该对象与接口关联起来。以下是修正后的代码示例:

### 修正代码

// 定义接口
export interface ArkTSFunModel { 
  __dcloud_weex_postMessage: (json: string) => void; 
  setTokenInfo: (tokenJson: string) => void; 
  routerPush: (page: string) => void; 
  routerPushWeb: (url: string) => void; 
}

// 创建对象并指定类型
const windowImpl: 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)
};

// 将对象赋值给 window
window: ArkTSFunModel = windowImpl;

### 解释

  1. 定义接口
export interface ArkTSFunModel { 
  __dcloud_weex_postMessage: (json: string) => void; 
  setTokenInfo: (tokenJson: string) => void; 
  routerPush: (page: string) => void; 
  routerPushWeb: (url: string) => void; 
}

确保接口定义包含你期望的所有方法。

  1. 创建对象并指定类型
const windowImpl: 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)
};

注意这里使用了类型注解 ​​ArkTSFunModel​​ 明确表示对象 ​​windowImpl​​ 实现了该接口。

  1. 将对象赋值给 window​:
window: ArkTSFunModel = windowImpl;

这样可以确保 ​​window​​ 变量具有正确的类型,并满足编译器的检查要求。

通过这种方式,编译器能够确保你创建的对象与接口 ​​ArkTSFunModel​​ 相匹配,从而避免了类型检查错误。

分享
微博
QQ
微信
回复
2024-09-26 19:05:55
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如下
1432浏览 • 1回复 待解决
HarmonyOS ArkUI有如下效果组件吗?
253浏览 • 1回复 待解决
如下代码报错报错原因是什么?
460浏览 • 1回复 待解决
ob有如何下报错,麻烦帮忙看一下?
4961浏览 • 1回复 待解决
使用featureAbility.getContext()时报错如下
691浏览 • 1回复 待解决
HarmonyOS native audio 录制编译报错
229浏览 • 1回复 待解决
不知道UIAbility时候
213浏览 • 1回复 待解决
开发自定义弹窗时报错如下
717浏览 • 1回复 待解决
openharmony 交叉编译openjdk报错
906浏览 • 1回复 待解决
编译报错没有堆栈信息
891浏览 • 1回复 待解决
在color.json文件中写注释报错如下
697浏览 • 1回复 待解决