HarmonyOS 鸿蒙4.0 迁移到 HarmonyOS 鸿蒙Next 报错记录。

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

HarmonyOS 鸿蒙4.0 迁移到 HarmonyOS 鸿蒙Next 报错记录。

这个帖子主要记录4.0迁移到NEXT版本报错记录,后面我遇到就记录一下。

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

解决:使用显式类型代替"any", “unknown” 

class Test1 {
ID: string = “”
}
aboutToAppear() {
let obj: Test1 = { ID: ‘hello’ }
console.log(‘Page25====’, obj.ID)
}

33 回复

2.Property 'title' has no initializer and is not definitely assigned in the constructor. 
属性'title'没有初始化器,也没有在构造函数中明确赋值。

编译没有问题,但是预览报错了,一定要赋值。

所以自定义组件成员变量初始化一定要赋值。哪怕赋值一个’’

解决:title: string=’’

 3.Array literals must contain elements of only inferrable types (arkts-no-noninferrable-arr-literals) <ArkTSCheck> 

这个错误有点类似1的错误。

解决也很简单:同样声明一个对象:

class C {
n: number = 0
s: string = ""
}
aboutToAppear(){
// let a = [{n: 1, s: "1"}, {n: 2, s : "2"}]
let a2: C[] = [{n: 1, s: "1"}, {n: 2, s : "2"}]
}

大家遇到问题,都可以在这个帖子下面提,我如果会就帮忙解答一下。

我按照群主的方式改了,在api11上面仍然有这个报错

类对象 :

export class TopBarItem { id: number = 0; name: string = “”;

constructor(id: number, name: string) { this.id = id; this.name = name; } }

声明赋值 :

import { TopBarItem } from ‘…/bean/TopBarItem’;

/**

  • Data of top bar. */ export const TOP_BAR_DATA: TopBarItem[] = [ { ‘id’: 0, ‘name’: ‘全部’ }, { ‘id’: 1, ‘name’: ‘电影’ }, { ‘id’: 2, ‘name’: ‘电视剧’ }, { ‘id’: 3, ‘name’: ‘综艺’ }, { ‘id’: 4, ‘name’: ‘动漫’ } ]

声明赋值的时候,还有如下报错: ERROR: ArkTS:ERROR File: E:/filmdemo/entry/src/main/ets/common/constants/TopBarConstants.ets:13:43 Array literals must contain elements of only inferrable types (arkts-no-noninferrable-arr-literals)

你写错了,数组里面的key值不能加引号的,你看看我上面的demo。所以你这样写才行: export const TOP_BAR_DATA: TopBarItem[] = [ { id: 0, name: ‘全部’ } ]

4.Use arrow functions instead of function expressions (arkts-no-func-expressions) <ArkTSCheck>

使用箭头函数,而不是表达式。

解决:

let f = (s: string) => {
console.log(s)
}

5.Use explicit types instead of "any", "unknown" (arkts-no-any-unknown) <ArkTSCheck>

这个错误终于在NEXT上修复啦,虽然TS支持这样写,但是作为一个曾经开发安卓的人来说,这种无类型的参数可以把人搞死,代码而且没有提示。太好了,这样更合理。

虽然有的人喜欢这样写,代码更简洁,但是缺少可读性,不结合上下文,完全不知道mediaQueryResult这个参数是啥。

这个解决方案:查看错误6里面的解决截图。

6."Function.apply", "Function.bind", "Function.call" are not supported (arkts-no-func-apply-bind-call) <ArkTSCheck>

接着5的错误写的:在API9可以这样使用:

portraitFunc = this.onPortrait.bind(this)
this.lin.on('change', portraitFunc)

这样可以把方法提到外面单独写。

但是API10这样写就报错了。

解决方案:使用箭头函数。

如果想把方法提出去写:可以在箭头函数里面调用,把这个callback传出去:

瞬间感觉ArkTS跟Kotlin写法差不多了,早知道这样学起来真的快啊,希望官方早点更新NEXT版本啊。我API9一刻也不想待了。

那在API10中是不是应该这样写啦 onPortrait(mediaQueryResult:mediaquery.MediaQueryResult) { if (mediaQueryResult.matches) { // 若设备为横屏状态,更改相应的页面布局 this.color = ‘#FFD700’ this.text = ‘Landscape’ } else { this.color = ‘#DB7093’ this.text = ‘Portrait’ } }

aboutToAppear() { this.listener.on(‘change’, (callback)=>{ this.onPortrait.bind(this) }) // 当媒体属性发生变更时会触发该回调。 }

是的就这样写

代码不得看,杰克!看看图,然后你再删掉我的评论,别乱了你的队形,总结的太棒啦cke_1541.png

不能使用bind方法。还是一样的错误。

直接this.onPortrait(callback)调用即可。

啊啊啊,原来如此!

下面这个问题该如何解决?

cke_250.png

子组件代码如下:

cke_1316.png

直接去掉。这样写:this.handleTaskChange

非常感谢你的解答,问题已经解决!谢谢!

cke_184.png

try catch里面的err 大家如何定义类型的

.catch((err: BusinessError) => {});

import { BusinessError } from ‘@ohos.base’;

1.1.png

杰克,我想知道这个问题怎么解决啊,要初始化赋值,但是我不清楚具体赋什么值

2.

2.png

还有这个,这个配置关系型数据库的,说我要为显式类型,name: sttring = 'taskList.db'这样改是对的嘛,我改成这样还是报错

3.

3.png

这个,我在定义类的时候,id和content都已经说明类型了,分别是number 和 string,在定义的类里面我改过id:number = 0,content:string = ''

然后push的时候是{ id:id,content:content,state:!!state } 但是依旧报错

4.png

这个问题亦是如此

4.5.png

这个是返回tasks数组的时候出现的错误,这些本来都是在api9 sdk3.2上可以正常使用的,但是我改为api10 sdk4.0之后就这样了,辛苦您解答一下

rbdStore这个对象可以看看是怎么定义的吗?是实体类还是什么。

是个接口,直接导入的,ctrl进去写的是interface RdbStore{ version: number; insert(table: string, values: ValuesBucket, callback: AsyncCallback<number>): void; …… }

这个接口有实现它的类吗?实现了的话可以直接new这个实体类。

setInterval 定时器在arkts里面类型是啥

export declare function setInterval(handler: Function | string, delay: number, …arguments: any[]): number; API10,是number类型,相当于它的一个id。你可以通过这个id来清空这个定时器。

private timerId: number = -1

aboutToAppear() { this.timerId = setInterval(() => {

}, 1000)
clearTimeout(this.timerId)

}

针对HarmonyOS 4.0迁移到HarmonyOS Next的报错记录,常见错误包括类型未明确声明、属性未初始化、泛型函数调用类型推断有限等。请确保所有对象字面量对应显式声明的类或接口,使用显式类型代替"any"、“unknown”,并在构造函数中明确赋值所有属性。此外,检查泛型函数调用的类型推断。如果问题依旧没法解决,请加我微信,我的微信是itying888。

回到顶部