HarmonyOS鸿蒙Next中两种interface的写法有什么区别

HarmonyOS鸿蒙Next中两种interface的写法有什么区别 官方文档介绍方法中实现匿名内部类的方法为:

cke_1014.png

测试发现使用

export interface TestListener {
  testA: () => void;
}

这种写法可以正常实例化对象

private test: TestListener = {
  testA: (): void => {
    console.log('dsdsfds');
  }
};

但是使用下述写法在实例化对象时则会报错:Object literal must correspond to some explicitly declared class or interface (arkts-no-untyped-obj-literals)

export interface TestListener {
  testA(): void;
} 该写法会在实例化时报错

请问这两种写法有什么区别,下图时官网上的接口定义

cke_31469.png


更多关于HarmonyOS鸿蒙Next中两种interface的写法有什么区别的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

【解决方案】

开发者您好,报错信息(arkts-no-untyped-obj-literals)要求:对象字面量必须对应于某些显式声明的类或接口即针对class/interface中包含方法的情形,要求这些方法应该被所有class的实例共享。ArkTS不支持通过Object literal改写实例方法。ArkTS支持函数类型的属性。

如果您使用下面这种写法定义接口:

export interface TestListener {
  testA(): void;
}

开发者可以这样去实例化接口:

private listener: OnTrustListener = {
    testA: (): void => {
      console.info('testA执行了');
    }
  }as ESObject

更多关于HarmonyOS鸿蒙Next中两种interface的写法有什么区别的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,两种interface写法的主要区别在于:一种用于声明对象类型,另一种用于声明接口类。

对象类型interface用于定义对象的形状,例如:

interface Person {
  name: string;
  age: number;
}

接口类interface用于定义类的契约,例如:

interface Drawable {
  draw(): void;
}
class Circle implements Drawable {
  draw() { /* 实现 */ }
}

前者描述数据结构,后者定义行为规范。

这两种interface写法在ArkTS中有本质区别,主要涉及方法定义方式类型系统检查

1. 写法差异分析

第一种写法(正常工作的):

export interface TestListener {
  testA: () => void;
}

这是属性函数写法,testA被定义为接口的一个属性,其类型是函数类型() => void

第二种写法(报错的):

export interface TestListener {
  testA(): void;
}

这是方法签名写法,testA被定义为接口的一个方法。

2. 实例化时的关键区别

当使用对象字面量实例化时:

对于属性函数写法:

private test: TestListener = {
  testA: (): void => {
    console.log('dsdsfds');
  }
};

这是有效的,因为对象字面量中的testA是一个属性,其值是一个箭头函数,与接口定义的属性函数类型匹配。

对于方法签名写法: 同样的对象字面量会报错,因为ArkTS要求方法签名在对象字面量中必须使用方法简写语法

private test: TestListener = {
  testA(): void {
    console.log('dsdsfds');
  }
};

3. 官方文档示例解析

你提供的官方文档截图显示的是:

interface OnAreaChangeListener {
  (oldValue: number, newValue: number): void;
}

这是函数类型接口(callable interface),与上述两种都不同。它定义的是接口本身可被调用,而不是定义接口的成员。

4. ArkTS的类型安全规则

报错信息arkts-no-untyped-obj-literals表明ArkTS禁止使用未明确类型的对象字面量。这是ArkTS比TypeScript更严格的地方:

  • 在TypeScript中,两种写法通常都能工作
  • 在ArkTS中,方法签名必须对应方法简写语法,属性函数必须对应属性赋值语法

5. 实际应用建议

  • 需要对象作为函数使用时:采用官方文档的函数类型接口写法
  • 需要定义回调接口时:推荐使用属性函数写法testA: () => void,兼容性更好
  • 需要定义类的方法契约时:使用方法签名写法testA(): void

这种严格性确保了ArkTS在跨平台场景下的类型安全性和运行时稳定性。

回到顶部