OpenHarmony: 实现文件没有默认导出,也可以默认导入

2024-12-18 13:25:13
217次阅读
0个评论

ArkTS 中关于声明文件默认导入问题的深度剖析

一、问题

在 ArkTS 的开发过程中,我们可能会遇到这样一种情况:当一个声明文件(例如 test.d.ts)并没有默认导出时,我们却在另一个文件(如 index.ets)中使用 import xxx from'module' 这种默认导入的方式进行导入,然而令人意外的是,编译过程中并没有报错。例如,在 test.d.ts 文件中有如下代码:

export const addFunction: {
  add: (a: number, b: number) => number
}

而在 index.ets 文件里:

import test from './test'

test.addFunction.add(1, 2)

二、原因

这种看似违背常理却不报错的现象,其根源在于编译时的配置文件中开启了 allowSyntheticDefaultImports 选项。这一选项具有强大的兼容性,它不仅允许在没有默认导出的声明文件情况下被另一文件默认导入,而且还能够很好地兼容从那些使用 CommonJSrequire)导出模块的库中导入默认导出(default exports)。以 react 库为例,当我们安装 @type/react 包后,使用默认导入的方式:

import React from "react"

let a: string = React.useId()

编译时同样不会报错。再看 CommonJS 模块的例子,在编译文件中:

import allFunction from 'library'

allFunction.sub(1, 2)

其依赖包的声明文件 index.d.ts 内容如下:

declare const allFunction : {
  sub: (a: number, b: number) => number
}
export = allFunction

依赖包的实现文件 index.js 为:

function sub(a, b) {
  return a - b
}

var allFuntion = { sub }
module.exports = allFuntion

三、解决方案

当我们遇到源码文件没有默认导出的情况时,为了遵循更规范的导入方式,我们可以尝试使用 import * as xx from 'xxx' 去进行导入。这种方式能够确保在没有默认导出时,正确地导入模块中的所有内容,避免因不合理的默认导入而可能引发的潜在问题,从而提高代码的稳定性和可维护性,使我们的 ArkTS 项目开发更加顺畅和可靠。

收藏00

登录 后评论。没有帐号? 注册 一个。