前言

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

除了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使用模块化内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

如何在TypeScript使用模块化以及注意事项详解的更多相关文章

  1. ios – Facebook错误包含框架模块内的非模块化头文件

    当我尝试集成Parse.com和FacebookSDK时,我收到以下错误.错误如下:我添加的库文件.更新–将YES更改为“允许在Framework模块中包含非模块化包含”解决方法转到“构建设置”并搜索“允许在Framework模块中包含非模块化包含”并将其更改为“是”

  2. Swift学习笔记之公用库和模块化

    静态库和动态库先补充一下静态库和动态库的知识。静态库静态库的代码追加到可执行文件内,被多次使用就有多份冗余拷。iOS中静态库的形式是.a和.framework。不过各个应用所使用的自己的公用库,最终都需要link进可执行文件,所以本质上还是一个静态库。现状出于安全层面的考虑,AppStore不允许使用第三方的动态链接库。我们可以通过framework编写自己的公用库。iOS-Universal-Framework也宣布停止更新。模块模块化是在2012年的LLVMDevelopersMeeting中提出的。

  3. swift – 具有依赖关系的CocoaPods框架 – 框架模块中包含非模块化头文件

    ]我看了几乎所有关于SO和github问题的相关问题,但是我找不到有用的东西.有人经历过这些问题,还是熟悉为什么这不行?

  4. 使用typescript类型实现ThreeSum

    这篇文章主要介绍了使用typescript类型实现ThreeSum,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以一下,希望对你学习又是帮助

  5.  typeScript入门基础介绍

    这篇文章主要介绍了 typeScript入门基础,TypeScript 是由微软开发的开源、跨平台的编程语言,是 javaScript 的超集,最终被编译为 javaScript代码。常常被简称为TS支持JS、ES语法,下文将继续其他基础介绍,需要的朋友可以参考一下

  6. typescript返回值类型和参数类型的具体使用

    本文主要介绍了typescript返回值类型和参数类型的具体使用文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. Vue3 携手 TypeScript 搭建完整项目结构

    TypeScript 是JS的一个超级,主要提供了类型系统和对ES6的支持,使用 TypeScript 可以增加代码的可读性和可维护性,在 react 和 vue 社区中也越来越多人开始使用TypeScript,这篇文章主要介绍了Vue3 携手 TypeScript 搭建完整项目结构,需要的朋友可以参考下

  8. 关于TypeScript开发的6六个实用小技巧分享

    TypeScript是Javascrip t超集,支持静态类型检测,可以在编译期提前暴露问题,节省debug时间,下面这篇文章主要给大家介绍了关于TypeScript开发的6六个实用小技巧,需要的朋友可以参考下

  9. typescript+react实现移动端和PC端简单拖拽效果

    这篇文章主要为大家详细介绍了typescript+react实现移动端和PC端简单拖拽效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Vue3 TypeScript 实现useRequest详情

    本文介绍了Vue3 TypeScript实现useRequest详情,useRequest可能是目前社区中最强大,最接地气的请求类 Hooks了。可以覆盖99%的网络请求场景,无论是读还是写,无论是普通请求还是分页请求,无论是缓存还是防抖节流,通通都能支持,关于其介绍需要的小伙伴可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部