js捆綁TypeScript聲明文件的方法教程
前話
TypeScript是JavaScript類型的超集,這是TypeScript的文檔介紹的一句話,那么他們存在聯(lián)系呢?
我的理解是,TypeScript在JavaScript基礎(chǔ)上引入強(qiáng)類型語(yǔ)言的特性。開發(fā)者使用TypeScript語(yǔ)法進(jìn)行編程開發(fā),最終通過(guò)轉(zhuǎn)換工具將TypeScript轉(zhuǎn)換成JavaScript。
使用TypeScript能夠避免在原生JavaScript上開發(fā)所帶來(lái)的弱類型語(yǔ)言的坑。(我該輸入啥?調(diào)用后返回啥?哎還是看看源碼吧。。。)
嗯!很好,強(qiáng)類型的JavaScript,挺好的。但是,我舍不得那NPM里眾多庫(kù)無(wú)微不至的人文關(guān)懷啊o(TヘTo)
別怕,現(xiàn)在很多庫(kù)已經(jīng)悄悄地支持TypeScript,就算它無(wú)心支持,也有無(wú)私奉獻(xiàn)的大佬們悄悄地幫這些庫(kù)支持TypeScript了
這就是引出了本文的主題,TypeScript的聲明文件,我認(rèn)為它是JavaScript庫(kù)類似C語(yǔ)言的頭文件,它的存在便是幫助TypeScript引入JavaScript庫(kù)
什么是聲明文件?
和 C/C++ 的 *.h 頭文件(Header files)非常相似:當(dāng)你在 C/C++ 程序中引用了一個(gè)第三方庫(kù)(.lib/.dll/.so/.a/.la)時(shí),C/C++ 編譯器無(wú)法自動(dòng)地識(shí)別庫(kù)內(nèi)導(dǎo)出名稱和函數(shù)類型簽名等,這就需要使用頭文件進(jìn)行接口聲明了。
同理地,TypeScript 的聲明文件是一個(gè)以 .d.ts 為后綴的 TypeScript 代碼文件,但它的作用是描述一個(gè) JavaScript 模塊(廣義上的)內(nèi)所有導(dǎo)出接口的類型信息。
關(guān)于TypeScript聲明文件的寫法和規(guī)范請(qǐng)參考參考如下官方文檔和優(yōu)秀博文:
- https://www.tslang.cn/docs/handbook/declaration-files/introduction.html
- http://www.dbjr.com.cn/article/138217.htm
根據(jù)官方文檔介紹,有以下兩個(gè)捆綁方式:
- 與你的npm包捆綁在一起
- 發(fā)布到npm上的@types organization
與npm包捆綁一起就是前面說(shuō)的,開發(fā)者在ts項(xiàng)目中npm install一個(gè)庫(kù)并在代碼文件中import后直接即可使用。
當(dāng)部分庫(kù)官方不維護(hù)的時(shí)候,就可以通過(guò)第二個(gè)方式,在npm install一個(gè)庫(kù)后,再執(zhí)行 npm install @types/庫(kù)名 安裝庫(kù)的聲明文件即可使用。其原理是TypeScript在2.0版本之后,當(dāng)你import 一個(gè)庫(kù)的時(shí)候,當(dāng)他在配置的include路徑中未找到指定的庫(kù),就會(huì)在node_modules的@types中尋找該庫(kù)。
一般來(lái)說(shuō),官方推薦第一種方式書寫發(fā)布聲明文件,下面我直接用例子來(lái)展示第一種捆綁方式吧。
例子
首先初始化TypeScript項(xiàng)目,目錄結(jié)構(gòu)如下:
tsconfig.json配置如下:
{ "compilerOptions": { "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ "allowJs": true, "outDir": "./dist", /* Redirect output structure to the directory. */ /* Allow javascript files to be compiled. */ "strict": true /* Enable all strict type-checking options. */ }, "include": [ "src/**/*" ] }
可以看到,我寫了個(gè)模塊 a ,并且給它捆綁了聲明文件,模塊 a ,即 src/a/index.js 內(nèi)容如下:
const NAME = 'A'; let call = (who) => { console.log('Hello ' + who + '! I am ' + NAME); } export default { call }
其聲明文件即 src/a/index.d.ts 內(nèi)容如下:
declare namespace a { function call(who: string): void; } export default a;
這時(shí),我們便可以在入口文件 src/index.ts 引入 a 模塊:
import a from './a'; a.call('Pwcong');
命令行執(zhí)行 tsc 后即可在目錄 dist 中生成js代碼:
執(zhí)行命令 node ./dist/index.js 可以得到相應(yīng)正確的輸出。
我們?cè)倌M導(dǎo)入發(fā)布后的NPM庫(kù),在 node_modules 目錄下創(chuàng)建目錄 b ,并初始化Node項(xiàng)目,這時(shí)目錄結(jié)構(gòu)如下:
其中 node_modules/b/types/package.json 內(nèi)容如下:
{ "name": "b", "version": "1.0.0", "main": "./src/index.js", "types": "./types/index.d.ts" }
node_modules/b/src/index.js 內(nèi)容如下:
const NAME = 'B'; let call = (who) => { console.log('Hello ' + who + '! I am ' + NAME); } module.exports = { call }
聲明文件 node_modules/b/types/index.d.ts 內(nèi)容如下:
declare namespace b { function call(who: string): void; } export = b;
這時(shí),我們修改 src/index.ts :
import a from './a'; a.call('Pwcong'); import b = require('b'); b.call('Pwcong');
命令行執(zhí)行 tsc 后即可在目錄 dist 中生成js代碼后執(zhí)行命令 node ./dist/index.js 也可以得到相應(yīng)正確的輸出。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
JavaScript使用shift方法移除素組第一個(gè)元素實(shí)例分析
這篇文章主要介紹了JavaScript使用shift方法移除素組第一個(gè)元素的用法,實(shí)例分析了javascript中shift方法的使用技巧,需要的朋友可以參考下2015-04-04escape、encodeURI 和 encodeURIComponent 的區(qū)別
escape(), encodeURI()和encodeURIComponent()是在Javascript中用于編碼字符串的三個(gè)常用的方法,而他們之間的異同卻困擾了很多的Javascript初學(xué)者,今天我就在這里對(duì)這三個(gè)方法詳細(xì)地分析與比較一下。2009-03-03javascript appendChild,innerHTML,join性能比較代碼
在實(shí)際應(yīng)用中,應(yīng)該避免直接用innerHTML,對(duì)于大量的字符連接運(yùn)算,應(yīng)該考慮先運(yùn)算再輸出。2009-08-08使用JavaScript下載圖片并保存到本地的詳細(xì)解釋和代碼示例
在前端開發(fā)中經(jīng)常會(huì)遇到需要將圖片從網(wǎng)絡(luò)上下載并保存到本地的需求,這篇文章主要給大家介紹了關(guān)于使用JavaScript下載圖片并保存到本地的詳細(xì)解釋和代碼示例,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07實(shí)現(xiàn)div可編輯的常見方法總結(jié)
實(shí)現(xiàn)div可編輯的常見方法總結(jié)...2007-04-04js中把JSON字符串轉(zhuǎn)換成JSON對(duì)象最好的方法
這篇文章主要介紹了js中把JSON字符串轉(zhuǎn)換為JSON對(duì)象最好的方法,需要的朋友可以參考下2014-03-03帶參數(shù)的function 的自運(yùn)行效果代碼
這篇文章介紹了帶參數(shù)的function 的自運(yùn)行效果,通過(guò)實(shí)例對(duì)比展示了帶參數(shù)與不帶參數(shù)function自運(yùn)行效果,需要的朋友可以參考一下2007-12-12