Umd 的包如何导出 TS 类型
在 TypeScript 里声明模块,的导出最早是包何用 namespace 和 module 的语法,后来支持了 es module,类型类型和变量会用 import 来导入、的导出用 export 导出。包何
比如你写了一个库,类型导出的的导出变量叫 Guang,它下面有 name 和 age 两个属性,包何所以你是类型这样声明类型的:
export default Guang;
declare namespace Guang {
export const name = guang;
export const age = 20;
}使用的时候用 import 来导入:
import Guang from xxx;
console.log(Guang.name, Guang.age);这样是没啥问题。
但如果这个库除了支持 es module 的的导出方式使用,还支持 umd 呢?包何
UMD 规范想必大家很熟悉了,就是类型判断是 CMD、AMD 还是的导出全局变量的方式,然后用合适的包何模块规范导出模块的值:

但这里面不包含 es module,因为它不是源码库类型 api 而是语法。
那如果你构建出了 umd 规范的代码,使用者用 script 的方式给引入了:

这样还能做类型提示和检查么?
不能了,因为你导出是用的 esm 的 export,只有 import 引入才会有类型提示和对应的检查。
那怎么办呢?
用 declare global 声明为全局类型?
declare global {
namespace Guang {
export const name = guang;
export const age = 20;
}
}这样是能解决问题,但这样在 esm 模块里也不用 import 就可以直接用了,而我们想在 esm 里用 import,其他情况才用全局类型。
有啥方式能约束在 esm 里只能 import 用,但是其他地方可以做为全局类型呢?
TypeScript 专门为这种情况设计个了语法,叫 export as namespace xxx;
比如上面的代码可以这样写:
export = Guang;
export as namespace Guang;
declare namespace Guang {
export const name = guang;
export const age = 20;
}export = Guang 是兼容老的 ts import 语法的,支持 umd 得加上这一行,然后加上 export as namespace Guang;
这样你在非 esm 里就可以通过全局类型的方式使用它了:

而在 esm 里,如果也是这样用的,它会报错:

说是你在 esm 模块里用了一个 UMD 的b2b供应网 global 类型,建议用 import 的方式代替。
如果你用 import 的方式引入了这个类型,就不报错了:

这就是它比 declare global 好的地方,可以约束在 esm 里用 import 引入,非 es module 可以作为全局类型。
这样就完美兼容了 esm 和 umd 两种模块引入方式。
而且如果你不想要这种限制,也可以在 tsconfig.json 里关掉。
有个 allowUmdGlobalAccess 的编译选项就是控制是否支持在 es module 里使用 UMD 全局类型的:

默认是 false,开启以后在 es module 里使用 UMD 全局类型就不报错了:

很多库都需要兼容 esm 和 umd 的使用方式都会这样用,比如 react:

所以,如果你开发的库需要支持 esm 和 umd 的话,可以用 export namespace as xxx 来导出,会比 declare global 更好。
总结现在 TypeScript 的模块都是 es module 的方式引入的,但有一些包是IT技术网支持 umd 的,它们可能用各种方式引入模块,为了实现 umd 模块的类型检查,可以用 declare global 把导出的变量变为全局的。
但是在 es module 里还是希望使用 import 引入,非 es module 才用全局类型,所以更好的方式是使用 export as namespace xxx。
用这种方式声明的类型,当在非 esm 中使用时,会作为全局类型,而在 esm 中如果直接引用全局类型会报错,建议用 import 引入。这是它比 declare global 更好的地方。
当然,也可以把 allowUmdGlobalAccess 的编译选项设置为 true 来放开这种约束。
像 react 这种支持 umd 的库都是用这种方式导出类型的,如果你也要开发一个支持 umd 的库,不妨也试试 export as namespace 吧。
相关文章
重装电脑脚本错误的解决方法(快速修复电脑重装脚本错误的技巧)
摘要:在电脑使用过程中,有时我们会遇到重装系统时出现的脚本错误,这可能导致系统无法正常安装或运行。为了帮助大家快速解决这一问题,本文将介绍一些常见的重装电脑脚本错误,并提供相应的解决方法...2025-11-04
要说最近网上最火的是谁,那一定是山东菏泽树哥郭有才了,他不仅自己火了,还火了一座城,火了一座车站-菏泽南站,让更多人知道了菏泽原来也是牡丹之乡。流量铺天盖地砸向菏泽,全国各地网红都往菏泽南站去了,部分2025-11-04
谷歌将在今年晚些时候推出多种防盗和数据保护功能,其中一些功能仅适用于 Android 15 及以上版本的设备,另一些功能将推广到数十亿运行 Android 10 及以上版本的设备。为了在设备被盗或丢失2025-11-04
一、多地域部署挑战1、Abase简介首先简单了解一下Abase在字节跳动公司以下简称字节)的使用情况。Abase是字节跳动规模最大的NoSQL数据库之一,峰值QPS达到了百亿级别,管理的数据存储容量达2025-11-04深度解析iPadmini3(探究iPadmini3的关键特性及其与前代产品的差异)
摘要:iPadmini3作为苹果公司的一款智能平板电脑,于2014年发布。它是iPadmini系列的第三代产品,相较于前代产品,在外观设计、硬件配置、系统功能等方面进行了升级与改进。本文...2025-11-04
亚马逊云科技在全球拥有数百万客户,每天追踪的事件达数十亿条,这让亚马逊云科技能检测到更多的安全威胁。在2019年亚马逊云科技首席安全官Steve Schmidt正式宣布推出首个聚焦云安全问题的会议亚马2025-11-04

最新评论