HarmonyOS鸿蒙Next中关于API导入的问题
BusinessError 是 interface,两种写法都正确
export interface BusinessError<T = void> extends Error {
code: number;
data?: T;
}
BusinessError<T = void> extends Error 是一个 纯类型定义 (接口),编译后会被完全擦除。
推荐使用import type { BusinessError }:
- 语义明确 - 告诉其他人这是纯类型使用
- 编译后完全移除 - 无任何运行时开销
- 避免潜在问题 - 防止意外导入运行时代码
两种在功能上等效,但 import type 是 ArkTS 的最佳实践 ,尤其对于这种纯接口类型。
更多关于HarmonyOS鸿蒙Next中关于API导入的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
不是所有场景都完全等效,虽然功能上可能相同,但还是推荐区分场景来使用:像interface、enum这种纯类型的推荐import type【语义更清晰,无开销】;既有类型又有值的导出也建议使用import type【避免导入不必要的值】;只有运行时需要的值例如类、函数、常量才推荐import。
那是所有import type都可以直接换成import吗
namespace呢,
在ArkTS中这两种写法都可以,但在语义上有一些区别:
import type { BusinessError } from '@kit.BasicServicesKit';
会明确告知编译器只用作类型标注,不在运行时使用,是符合arkts强静态约束的规则
常用在 catch块中
let error = err as BusinessError; // 做类型断言
console.error(`错误码: ${error.code}, 信息: ${error.message}`);
import { BusinessError } from '@kit.BasicServicesKit'
编译器不确定是用作类型还是class,需要进行推断
在运行时使用:
if (err instanceof BusinessError) { // 需要真实类引用
}
可以都写成 import { BusinessError } 不会报错,功能也正常。
实战项目中统一写法,更推荐 import type { BusinessError }
尊敬的开发者您好,一般都不加type的,都使用这种格式即可:
import { BusinessError } from '@kit.BasicServicesKit';
官方文档中也没有加type,详见:@ohos.base (公共回调信息)
因为ArkTS是源于TS(TypeScript)的,很多语法的学习可以对比着TS去学习。
import type在TS里是一个优化,详细的可参考《TypeScript》的文档。
使用过程中:
如果是开发应用,用import遇到问题再考虑用import type就行。
如果是开发SDK,能用import type尽量用。
-
区别
import type:纯类型导入,编译后消失,仅用于类型校验。- 普通
import:导入值 + 类型,编译后保留。
-
BusinessError 是接口类型两种写法完全通用,全部写成普通导入是可以的,无任何问题。
-
官方规范类型推荐用
import type,普通导入也兼容。
官方文档:https://arkts-lang.cn/manual/arkts-ts-compatibility/syntax-import-type.html
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,
背景知识:
import type 与标准 import 存在明确的语义差异,具体区别如下:
import type:
仅导入类型声明(不包含运行时对象),零运行时开销
import
导入具体值(包括类型定义和运行时对象),会增加输出文件体积
没必要强加type,多了限制可能在某些业务场景限制更多,按照官网最简写法即可,
有区别的,如果只是当类型使用时,建议使用import type;运行值和类时,要使用import,这两类都可以使用,type类型更加官方
其实可以都写成不带 type 的,但带 type 是官方推荐、更规范、编译更快、不会出问题。
带type:
- 只导入类型(interface / type)
- 编译后会被完全删掉,不生成任何 JS 代码
- 只用于类型检查、代码提示
- 不会被打包进运行时
- 官方 99% 的示例都这么写
不带 type:
- 既导入值,也导入类型
- 编译器会尝试找这个东西是不是一个变量 / 类 / 函数
- 如果它只是类型,编译后也会被删掉
那是所有import type都可以直接换成import吗
具体可以根据使用场景,当仅导入类型声明(不包含运行时的值)时,可以使用import type
一般情况下就是这么用的:
import { BusinessError } from '@kit.BasicServicesKit';
在HarmonyOS Next中,API导入需使用ArkTS语法,通过import语句从@ohos或@kit等系统包导入。例如:import { xxx } from '@ohos.yyy'。第三方库通过ohpm安装后,使用包名导入。确保模块在module.json5中已声明依赖。
在HarmonyOS Next(基于ArkTS/TypeScript)中,import type { BusinessError } 与普通 import { BusinessError } 的关键区别在于:import type 仅导入类型信息,编译时完全擦除,不产生运行时代码,有助于减小包体积和优化编译。普通 import 则会保留值的依赖,即便只用作类型注解。如果 BusinessError 只在类型标注中使用,直接写 import { BusinessError } 也功能正常,编译器可能通过树摇消除,但官方推荐使用 import type,能更清晰区分“类型导入”和“值导入”,避免无意中引入副作用,也符合ArkTS最佳实践。

