js捆绑TypeScript声明文件的方法教程


Posted in Javascript onApril 13, 2018

前话

TypeScript是JavaScript类型的超集,这是TypeScript的文档介绍的一句话,那么他们存在联系呢?

我的理解是,TypeScript在JavaScript基础上引入强类型语言的特性。开发者使用TypeScript语法进行编程开发,最终通过转换工具将TypeScript转换成JavaScript。

使用TypeScript能够避免在原生JavaScript上开发所带来的弱类型语言的坑。(我该输入啥?调用后返回啥?哎还是看看源码吧。。。)

嗯!很好,强类型的JavaScript,挺好的。但是,我舍不得那NPM里众多库无微不至的人文关怀啊o(TヘTo)

别怕,现在很多库已经悄悄地支持TypeScript,就算它无心支持,也有无私奉献的大佬们悄悄地帮这些库支持TypeScript了

这就是引出了本文的主题,TypeScript的声明文件,我认为它是JavaScript库类似C语言的头文件,它的存在便是帮助TypeScript引入JavaScript库

什么是声明文件?

和 C/C++ 的 *.h 头文件(Header files)非常相似:当你在 C/C++ 程序中引用了一个第三方库(.lib/.dll/.so/.a/.la)时,C/C++ 编译器无法自动地识别库内导出名称和函数类型签名等,这就需要使用头文件进行接口声明了。

同理地,TypeScript 的声明文件是一个以 .d.ts 为后缀的 TypeScript 代码文件,但它的作用是描述一个 JavaScript 模块(广义上的)内所有导出接口的类型信息。

关于TypeScript声明文件的写法和规范请参考参考如下官方文档和优秀博文:

  • https://www.tslang.cn/docs/handbook/declaration-files/introduction.html
  • https://3water.com/article/138217.htm

根据官方文档介绍,有以下两个捆绑方式:

  • 与你的npm包捆绑在一起
  • 发布到npm上的@types organization

与npm包捆绑一起就是前面说的,开发者在ts项目中npm install一个库并在代码文件中import后直接即可使用。

当部分库官方不维护的时候,就可以通过第二个方式,在npm install一个库后,再执行 npm install @types/库名 安装库的声明文件即可使用。其原理是TypeScript在2.0版本之后,当你import 一个库的时候,当他在配置的include路径中未找到指定的库,就会在node_modules的@types中寻找该库。

一般来说,官方推荐第一种方式书写发布声明文件,下面我直接用例子来展示第一种捆绑方式吧。

例子

首先初始化TypeScript项目,目录结构如下:

js捆绑TypeScript声明文件的方法教程

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/**/*"
 ]
}

可以看到,我写了个模块 a ,并且给它捆绑了声明文件,模块 a ,即 src/a/index.js 内容如下:

const NAME = 'A';
let call = (who) => {
 console.log('Hello ' + who + '! I am ' + NAME);
}
export default {
 call
}

其声明文件即 src/a/index.d.ts 内容如下:

declare namespace a {
 function call(who: string): void;
}
export default a;

这时,我们便可以在入口文件 src/index.ts 引入 a 模块:

import a from './a';
a.call('Pwcong');

命令行执行 tsc 后即可在目录 dist 中生成js代码:

js捆绑TypeScript声明文件的方法教程

执行命令 node ./dist/index.js 可以得到相应正确的输出。

我们再模拟导入发布后的NPM库,在 node_modules 目录下创建目录 b ,并初始化Node项目,这时目录结构如下:

js捆绑TypeScript声明文件的方法教程

其中 node_modules/b/types/package.json 内容如下:

{
 "name": "b",
 "version": "1.0.0",
 "main": "./src/index.js",
 "types": "./types/index.d.ts"
}

node_modules/b/src/index.js 内容如下:

const NAME = 'B';
let call = (who) => {
 console.log('Hello ' + who + '! I am ' + NAME);
}
module.exports = {
 call
}

声明文件 node_modules/b/types/index.d.ts 内容如下:

declare namespace b {
 function call(who: string): void;
}
export = b;

这时,我们修改 src/index.ts :

import a from './a';
a.call('Pwcong');
import b = require('b');
b.call('Pwcong');

命令行执行 tsc 后即可在目录 dist 中生成js代码后执行命令 node ./dist/index.js 也可以得到相应正确的输出。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript设置FieldSet展开与收缩
May 15 Javascript
JavaScript类属性的访问方式详解
Feb 11 Javascript
纯CSS3代码实现滑动开关效果
Aug 19 Javascript
Bootstrap实现登录校验表单(带验证码)
Jun 23 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
Oct 09 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
Oct 14 Javascript
原生JS发送异步数据请求
Jun 08 Javascript
浅谈pc端rem字体设置的问题
Aug 03 Javascript
详解layui中的树形关于取值传值问题
Jan 16 Javascript
小程序自定义组件实现城市选择功能
Jul 18 Javascript
jQuery实现基本隐藏与显示效果的方法详解
Sep 05 jQuery
jQuery实现雪花飘落效果
Aug 02 jQuery
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
Apr 13 #Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
Apr 13 #Javascript
如何编写一个d.ts文件的步骤详解
Apr 13 #Javascript
VSCode中如何利用d.ts文件进行js智能提示
Apr 13 #Javascript
Vue2.0 实现单选互斥的方法
Apr 13 #Javascript
Vue render深入开发讲解
Apr 13 #Javascript
用vue2.0实现点击选中active其他选项互斥的效果
Apr 12 #Javascript
You might like
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
jQuery简单获取键盘事件的方法
2016/01/22 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
python实现定制交互式命令行的方法
2014/07/03 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
tornado+celery的简单使用详解
2019/12/21 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
python实现双人五子棋(终端版)
2020/12/30 Python
文员岗位职责
2013/11/09 职场文书
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
PHP策略模式写法
2021/04/01 PHP
如何用Navicat操作MySQL
2021/05/12 MySQL
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
SQLServer常见数学函数梳理总结
2022/08/05 MySQL
Tomcat安装使用及部署Web项目的3种方法汇总
2022/08/14 Servers