HarmonyOS鸿蒙Next中关于API导入的问题

HarmonyOS鸿蒙Next中关于API导入的问题 import type { BusinessError } from ‘@kit.BasicServicesKit’;我想问一下这个type和import { BusinessError } from ‘@kit.BasicServicesKit’;有什么区别吗,都写成import { BusinessError } from ‘@kit.BasicServicesKit’;可以吗

18 回复

BusinessError 是 interface,两种写法都正确

export interface BusinessError<T = void> extends Error {
  code: number;
  data?: T;
}

BusinessError<T = void> extends Error 是一个 纯类型定义 (接口),编译后会被完全擦除。

推荐使用import type { BusinessError }:

  1. 语义明确 - 告诉其他人这是纯类型使用
  2. 编译后完全移除 - 无任何运行时开销
  3. 避免潜在问题 - 防止意外导入运行时代码

两种在功能上等效,但 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尽量用。

  1. 区别

    • import type纯类型导入,编译后消失,仅用于类型校验。
    • 普通 import:导入值 + 类型,编译后保留。
  2. BusinessError 是接口类型两种写法完全通用,全部写成普通导入是可以的,无任何问题。

  3. 官方规范类型推荐用 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:

  1. 只导入类型(interface / type)
  2. 编译后会被完全删掉,不生成任何 JS 代码
  3. 只用于类型检查、代码提示
  4. 不会被打包进运行时
  5. 官方 99% 的示例都这么写

不带 type:

  1. 既导入值,也导入类型
  2. 编译器会尝试找这个东西是不是一个变量 / 类 / 函数
  3. 如果它只是类型,编译后也会被删掉

那是所有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最佳实践。

回到顶部