前言
模塊在其自身的作用域里執行,而不是在全局作用域里;這意味著定義在一個模塊里的變量,函數,類等等在模塊外部是不可見的,除非你明確地使用export之一導出它們。 相反,如果想使用其它模塊導出的變量,函數,類,接口等的時候,你必須要導入它們,可以使用import之一。
模塊是自聲明的。在TypeScript里,兩個模塊之間的關系是通過在文件級別上使用import和export建立的。
下面話不多說了,來一起看看詳細的介紹吧
ES6 模塊導入的限制
我們先來看一個具體的例子:
在 Node 項目里,使用 CommonJS 規范引入一個模塊:
const koa = require('koa')
改寫為 TypeScript(1.5+ 版本)時,通常有兩種方式:
使用 ES6 模塊導入方式:
// allowSyntheticDefaultImports: false import * as koa from 'koa'
使用 TypeScript 模塊導入語法:
import koa = require('koa')
兩者大部分是等價的,但 ES6 規范對 import * as 創建出的模塊對象有一點限制。
根據該規范,該模塊對象不可被調用,也不可被實例化,它只具有屬性。
因此,如果你想調用該對象,或者使用 new 方法,在 allowSyntheticDefaultImports: false 的配置下,應該使用例子中的第二種方式。
2.7 版本對 CommonJs/AMD/UMD 模塊導入的增強
在之前的版本,TypeScript 對 CommonJs/AMD/UMD 模塊的處理方式與 ES6 模塊相同,這會導致一些問題:
在 2.7 的版本里,TypeScript 提供了一個新選項 --esModuleInterop,旨在解決上述問題,
當使用該選項,且模塊為 CommonJs/AMD/UMD 時,它會導入一個可調用或是可實例化的模塊,同時它規定該模塊必須作為默認導入:
import koa from 'koa' const app = new koa()
模塊導入僅僅是一些聲明類型
在以非相對路徑導入一個模塊時,你可能會看到 Could not find a declaration file for module 'someModule' 的錯誤, 此時你可以安裝對應模塊的聲明文件或者寫一個包含 declare module 'someModule' 的聲明文件。
實際上,當我們導入一個模塊時:
import koa from 'koa' // import koa = require('koa')
它所做的事情只有兩個:
當你加載此模塊,但并沒有使用,或僅當作類型來使用時,編譯后,此模塊將會被移除。
當不使用時;
import koa from 'koa'
編譯后:
僅當做類型使用時:
import koa from 'koa' let k: koa
編譯后:
var k
做為值使用時,編譯后,此模塊將會被保留:
import koa from 'koa' const app = new koa()
編譯后(假設使用 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 選項時產生的方法。
參考
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
總結
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com