關(guān)于TypeScript模塊導(dǎo)入的那些事
前言
模塊在其自身的作用域里執(zhí)行,而不是在全局作用域里;這意味著定義在一個(gè)模塊里的變量,函數(shù),類等等在模塊外部是不可見的,除非你明確地使用export之一導(dǎo)出它們。 相反,如果想使用其它模塊導(dǎo)出的變量,函數(shù),類,接口等的時(shí)候,你必須要導(dǎo)入它們,可以使用import之一。
模塊是自聲明的。在TypeScript里,兩個(gè)模塊之間的關(guān)系是通過在文件級(jí)別上使用import和export建立的。
下面話不多說了,來一起看看詳細(xì)的介紹吧
ES6 模塊導(dǎo)入的限制
我們先來看一個(gè)具體的例子:
在 Node 項(xiàng)目里,使用 CommonJS 規(guī)范引入一個(gè)模塊:
const koa = require('koa')
改寫為 TypeScript(1.5+ 版本)時(shí),通常有兩種方式:
使用 ES6 模塊導(dǎo)入方式:
// allowSyntheticDefaultImports: false import * as koa from 'koa'
使用 TypeScript 模塊導(dǎo)入語法:
import koa = require('koa')
兩者大部分是等價(jià)的,但 ES6 規(guī)范對(duì) import * as 創(chuàng)建出的模塊對(duì)象有一點(diǎn)限制。
根據(jù)該規(guī)范,該模塊對(duì)象不可被調(diào)用,也不可被實(shí)例化,它只具有屬性。
因此,如果你想調(diào)用該對(duì)象,或者使用 new 方法,在 allowSyntheticDefaultImports: false 的配置下,應(yīng)該使用例子中的第二種方式。
2.7 版本對(duì) CommonJs/AMD/UMD 模塊導(dǎo)入的增強(qiáng)
在之前的版本,TypeScript 對(duì) CommonJs/AMD/UMD 模塊的處理方式與 ES6 模塊相同,這會(huì)導(dǎo)致一些問題:
- 如前文所提到的,當(dāng)導(dǎo)入一個(gè) CommonJs/AMD/UMD 模塊時(shí),TypeScript 視 import * as koa from 'koa' 與 const koa = require('koa') 等價(jià),但使用 import * as 創(chuàng)建的模塊對(duì)象實(shí)際上不可被調(diào)用以及被實(shí)例化。
- 類似的,當(dāng)導(dǎo)入一個(gè) CommonJs/AMD/UMD 模塊時(shí),TypeScript 視 import foo from 'foo' 與 const koa = require('koa').default 等價(jià),但在大部分 CommonJs/AMD/UMD 模塊里,它們并沒有默認(rèn)導(dǎo)出。
在 2.7 的版本里,TypeScript 提供了一個(gè)新選項(xiàng) --esModuleInterop,旨在解決上述問題,
當(dāng)使用該選項(xiàng),且模塊為 CommonJs/AMD/UMD 時(shí),它會(huì)導(dǎo)入一個(gè)可調(diào)用或是可實(shí)例化的模塊,同時(shí)它規(guī)定該模塊必須作為默認(rèn)導(dǎo)入:
import koa from 'koa' const app = new koa()
模塊導(dǎo)入僅僅是一些聲明類型
在以非相對(duì)路徑導(dǎo)入一個(gè)模塊時(shí),你可能會(huì)看到 Could not find a declaration file for module 'someModule' 的錯(cuò)誤, 此時(shí)你可以安裝對(duì)應(yīng)模塊的聲明文件或者寫一個(gè)包含 declare module 'someModule' 的聲明文件。
實(shí)際上,當(dāng)我們導(dǎo)入一個(gè)模塊時(shí):
import koa from 'koa' // import koa = require('koa')
它所做的事情只有兩個(gè):
- 導(dǎo)入模塊的所有類型信息;
- 確定運(yùn)行時(shí)的依賴關(guān)系。
當(dāng)你加載此模塊,但并沒有使用,或僅當(dāng)作類型來使用時(shí),編譯后,此模塊將會(huì)被移除。
當(dāng)不使用時(shí);
import koa from 'koa'
編譯后:
僅當(dāng)做類型使用時(shí):
import koa from 'koa' let k: koa
編譯后:
var k
做為值使用時(shí),編譯后,此模塊將會(huì)被保留:
import koa from 'koa' const app = new koa()
編譯后(假設(shè)使用 commonjs):
var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var koa_1 = __importDefault(require("koa")); var k = new koa_1.default();
注: __importDefault 為使用 --esModuleInterop 選項(xiàng)時(shí)產(chǎn)生的方法。
參考
http://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html
https://stackoverflow.com/questions/35706164/typescript-import-as-vs-import-require?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
https://basarat.gitbooks.io/typescript/content/docs/project/external-modules.html
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
使用bat打開多個(gè)cmd窗口執(zhí)行g(shù)ulp、node
本文主要介紹了使用bat打開多個(gè)cmd窗口執(zhí)行g(shù)ulp、node的方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02微信小程序防止多次點(diǎn)擊跳轉(zhuǎn)和防止表單組件輸入內(nèi)容多次驗(yàn)證功能(函數(shù)防抖)
這篇文章主要介紹了微信小程序防止多次點(diǎn)擊跳轉(zhuǎn)和防止表單組件輸入內(nèi)容多次驗(yàn)證功能(函數(shù)防抖),需要的朋友可以參考下2019-09-09基于JavaScript實(shí)現(xiàn)文字超出部分隱藏
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)文字超出部分隱藏 的相關(guān)資料,需要的朋友可以參考下2016-02-02JavaScript實(shí)現(xiàn)點(diǎn)擊按鈕字體放大、縮小
字體可以調(diào)節(jié)大小,極大了滿足了用戶體驗(yàn)度,接下來通過本文給大家介紹JavaScript實(shí)現(xiàn)點(diǎn)擊按鈕字體放大、縮小實(shí)例代碼,需要的朋友參考下吧2016-02-02