如何在TypeScript使用模块化以及注意事项详解

 更新时间:2022年10月16日 09:31:24   作者:前端刺不刺客  
在TypeScript中就像在EC5中一样,任何包含顶级import或export的文件都被认为是一个模块,下面这篇文章主要给大家介绍了关于如何在TypeScript使用模块化以及注意事项的相关资料,需要的朋友可以参考下

前言

随着我们的代码越来越庞大,我们需要拆分模块组合, 便于后续的维护

除了commonJS, es6. ts也是支持模块化的!🖐️

如何在TS中写es6模块化语句

自从发布ES6(ES2015)之后, ts就采用了es6的模块化标准-导出和导入模块😦

  • 写法:

导出:

myModule.ts
    export const name: number = 123
    export const getUser = (user: string): void => {
      console.log(user)
    }

导入:

index.ts
    import { name, getUser } from "./myModule";
    getUser(name)
  • 值得注意的是TS的智能提示发挥到了超乎想象👀

没有引入直接使用变量, 波浪线智能提示从哪里引入

直接书写变量,enter直接带出引入

👉虽智能, 但还是要注意几点

注意事项详细
获取智能提示有条件但是要注意的是: 这个提示只适用于export, 不适用于export default。因为export有固定的变量名,而export default导出没有名字和引入时随意起名字, TS不会去猜测
import引入的文件名import引入的文件名不能带上.ts, 因为会参与编译的过程, 编译后的结果为js,找不到ts这个文件

如何在TS中写commonjs模块化语句

按我们之前的写法,是这样子写的

// 导出
module.exports = {
    sum (a: number, b: numnber) {
        return a + b
    }
}

//引入
const mymodule = require('./xxx')

此时会发现mymodule的类型为any,没有类型检查了

  • ts中这样才能有完整的类型检查, 并且和上述写法的编译结果一样
// 导出
exports = {
    sum (a: number, b: numnber) {
        return a + b
    }
}

//引入
import mymodule = require('./xxx')

会发现写法还是有差异的,

所以建议还是使用es6的标准会比较好,因为ta是后面的标准

解决导入错误的情况

先看一个例子,我们在代码里引入node中的fs模块

ts文件中:

    import fs from "fs";
    fs.readFileSync('./')

编译结果:

    // tsconfig.json中设置module: CommonJs, 结果如下

    exports.__esModule = true;
    var fs_1 = require("fs");
    fs_1["default"].readFileSync('./');

🙄此时会发现一些问题

  • 1.在ts文件中书写会报错
  • 2.编译结果中, 使用了default属性.readFileSync

编译后的fs没有default属性, 所以报错了

为什么会报错呢

 import fs from "fs";

fs不是标准esmodule标准导出 因为fs默认使用module.exports={}的形式导出, import直接引入, 编译结果会带上default, fs中没有default属性

解决方案

  • 💦1.解构出方法使用, 这样就不会使用default属性

ts文件中:

    import { readFileSync } from "fs";
    readFileSync('./')

编译结果:

    exports.__esModule = true;
    var fs_1 = require("fs");
    (0, fs_1.readFileSync)('./');
  • 💦2.使用* as fs全部导入, 将module.exports内全部导入

ts文件中:

    import * as fs from "fs";
    fs.readFileSync('./')

编译结果:

    exports.__esModule = true;
    var fs = require("fs");
    fs.readFileSync('./');
  • 💦3.设置esModuleInteroptrue, 让TS识别出是否导出esmudole标准形式,并作出相应的处理
tsconfig.json

{
  "compilerOptions": { 
    // 启用es模块化交互而非es模块导出
    "esModuleInterop": true
  }
}

ts文件中:

    import fs from "fs";
    fs.readFileSync('./')

编译结果:

// 生成辅助函数__importDefault
// 此时如果不是属于esmodule形式导出, ts会默认添加default属性,值设置为本身
    var __importDefault = (this && this.__importDefault) || function (mod) {
        return (mod && mod.__esModule) ? mod : { "default": mod };
    };
    exports.__esModule = true;
    var fs_1 = __importDefault(require("fs"));
    fs_1["default"].readFileSync('./');

补充:TypeScript命名空间

TypeScript有自己的模块格式,称为 命名空间(namespaces) ,这比ES模块标准要早

这种语法对于创建复杂的定义文件有很多有用的功能,并且在DefinitelyTyped中仍然被积极使用。虽然没有被废弃,但命名空间中的大部分功能都存在于ES Modules中,官方建议使用它来与JavaScript的方向保持一致

总结

到此这篇关于如何在TypeScript使用模块化以及注意事项的文章就介绍到这了,更多相关TypeScript使用模块化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用 JavaScript 进行函数式编程 (一) 翻译

    使用 JavaScript 进行函数式编程 (一) 翻译

    本文是函数式编程系列的第一篇文章。这里我会简要介绍一下编程范式,然后会直接介绍使用 Javascript 进行函数式编程的概念,因为 JavsScript 是最被认可的函数式程序语言之一。我们鼓励读者通过参考资料部分进一步了解这一迷人的概念
    2015-10-10
  • JS实现滑动门效果的方法详解

    JS实现滑动门效果的方法详解

    这篇文章主要介绍了JS实现滑动门效果的方法,结合实例形式分析了滑动门效果的实现原理、步骤与相关注意事项,需要的朋友可以参考下
    2016-12-12
  • 基于JavaScript实现评论框展开和隐藏功能

    基于JavaScript实现评论框展开和隐藏功能

    本文通过实例代码给大家介绍了基于JavaScript实现评论框展开和隐藏功能,感兴趣的朋友参考下吧
    2017-08-08
  • javascript中如何将字符串转换成数字

    javascript中如何将字符串转换成数字

    这篇文章主要介绍了javascript中如何将字符串转换成数字问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • js实现用户输入的小写字母自动转大写字母的方法

    js实现用户输入的小写字母自动转大写字母的方法

    下面小编就为大家带来一篇js实现用户输入的小写字母自动转大写字母的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • JS实现转动随机数抽奖特效代码

    JS实现转动随机数抽奖特效代码

    这篇文章主要为大家详细介绍了一款转动随机数抽奖的JS特效代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-08-08
  • 微信小程序 css使用技巧总结

    微信小程序 css使用技巧总结

    这篇文章主要介绍了微信小程序 css使用技巧总结的相关资料,需要的朋友可以参考下
    2017-01-01
  • uniapp制作一个收缩通讯录的实现代码

    uniapp制作一个收缩通讯录的实现代码

    这篇文章主要介绍了uniapp制作一个收缩通讯录的实现代码,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • 微信小程序移动拖拽视图-movable-view实例详解

    微信小程序移动拖拽视图-movable-view实例详解

    这篇文章主要介绍了微信小程序移动拖拽视图-movable-view的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 浅谈js中test()函数在正则中的使用

    浅谈js中test()函数在正则中的使用

    下面小编就为大家带来一篇浅谈js中test()函数在正则中的使用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08

最新评论