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
选项。这一选项具有强大的兼容性,它不仅允许在没有默认导出的声明文件情况下被另一文件默认导入,而且还能够很好地兼容从那些使用 CommonJS
(require
)导出模块的库中导入默认导出(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