<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在 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 的 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 的方式引入的,但有一些包是支援 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 吧。
以上就是UMD的包匯出TS 型別方法範例的詳細內容,更多關於UMD包匯出TS型別的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45