ts(typescript) 的模块化

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: ts 中可以通过使用 module 设置编译结果中使用的模块化标准,这个可以依照环境的不同来设置,如浏览器设置 es6, node 设置 commonjs等,这个是灵活处理的。

ts(typescript) 模块化


模块化标准


ts 中的模块化,尽量统一使用 es6(es2015)的模块化标准

前端领域中的模块化标准:ES6、commonjs、amd、umd、system、esnext


例如:


// a.ts 文件
// 导出一个常量
export const a: number = 1;
// 导出一个函数
export function b(a: number, b: number): number {
  return a + b;
}
function defaultFunc() {
  console.log('this is default function')
}
// 默认导出
export default defaultFunc;
//index.ts 文件
// require('./poker/index.ts')
import defaultFunc, { a, b } from "./a";
console.log(a, b(1, 2),defaultFunc())


结果:


20210112154309357.png


编译结果对比


ts 中可以通过使用 module 设置编译结果中使用的模块化标准,这个可以依照环境的不同来设置,如浏览器设置 es6, node 设置 commonjs等,这个是灵活处理的。


  • ts 里面的代码使用的es6的导入和导出,编译的模块化是es6对比如下:


20210112155415169.png

20210112155501884.png


结论: 上面的两张图中我们可以看到,ts里面的模块化使用es6,编译的结果也是es6,他们两者是没有区别的,但是要注意一个问题,导入模块的时候千万不能使用后缀名xxx.ts,因为编译后的结果是没有.ts后缀的文件的


  • ts 里面的代码使用的es6的导入和导出,编译的模块化是commonjs对比如下


20210112160717614.png

20210112160859291.png


结论:ts 的配置,编译的对象可以兼容很古老的语法,为了兼容旧版本,但是ts是遵从es标准的。如果编译结果的模块化标准是commonjs:导出的声明会变成exports的属性,默认的导出会变成exports的default属性;


解决默认导入问题


在index.ts中直接导入fs模块, 例如import fs from 'fs',但是结果确实报错的,如下:


20210112161635713.png


编译的结果如下(虽然说报错了, 但是ts默认是可以编译的,这个可以通过配置来进行配置):


20210112161855278.png


但是如何解决这个问题呢?


  • 方法一:按需导入


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


编译的结果如下:这个时可以正常使用的。


20210112162144330.png


  • 方法二: 重命名的导入


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

20210112164004312.png


  • 方法三:在ts.config.json中配置启用esModuleInterop 启用es模块化交互非es模块导出


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

20210112164703232.png


ts 中书写common js 的代码


在ts 中,我们可以使用commonjs的语法,导出使用 module.export 或者 exports.xxx, 使用 require('xxx')来进行导入,但是这样的话就得不到 ts的类型检查了。


如何既可以使用commonjs的语法,也要能进行类型检查呢?


ts 新增了一个语法:


导出:export = xxx
导入:import xxx = require("xxx")


例如:


// a.ts 文件
// 定义一个变量
const a: number = 1;
// 定义一个函数
function b(a: number, b: number): number {
  return a + b;
}
// 导出变量和函数
export= {
  a: a,
  b: b,
}
// index.ts 文件
import obj = require('./a');
console.log(obj.a, obj.b(1, 2))


运行结果如下:


20210112170042623.png


编译结果如下:


  • a.ts 文件


20210112170159533.png


  • index.ts 文件


2021011217024990.png


ts的模块解析策略


TS中,有两种模块解析策略


  • classic:经典, 已经成为过去了
  • node:node解析策略(唯一的变化,是将js替换为ts)

。相对路径require("./xxx")

。非相对模块require("xxx")


可以使用配置文件来进行配置:


在ts.config.json 中使用 moduleResolution 来进行模块解析策略的配置。


本博客用到的ts的配置:


配置名称 含义
module 设置编译结果中使用的模块化标准
moduleResolution 设置解析模块的模式
noImplicitUseStrict 编译结果中不包含"use strict"
removeComments 编译结果移除注释
noEmitOnError 错误时不生成编译结果
esModuleInterop 启用es模块化交互非es模块导出


详细配置参考

相关文章
|
8月前
|
存储 JavaScript 前端开发
TS中 说说数组在TypeScript中是如何工作的?
TS中 说说数组在TypeScript中是如何工作的?
|
8月前
|
JavaScript
【typeScript】搭建TS环境
【typeScript】搭建TS环境
|
4月前
|
JavaScript
typeScript基础(3)_ts函数默认值和可选参数
本文介绍了在TypeScript中如何使用函数的默认值和可选参数。展示了如何为函数参数指定默认值,使得在调用函数时可以省略某些参数,以及如何定义可选参数。
239 2
|
4月前
|
JavaScript 前端开发
typeScript基础(8)_ts类型断言
本文介绍了TypeScript中的类型断言,它用于在编译时告诉TypeScript某个对象具有特定的类型,即使它看起来不具备。类型断言可以用来访问一个类型上存在而另一个类型上不存在的属性或方法。需要注意的是,类型断言并不会在运行时改变JavaScript的行为,因此如果断言不当,运行时仍然可能出错。文章还提醒避免将类型断言为`any`类型或进行多重断言。
45 1
|
3月前
|
JavaScript 索引
TypeScript(TS)安装指南与基础教程学习全攻略(二)
TypeScript(TS)安装指南与基础教程学习全攻略(二)
63 0
|
3月前
|
JavaScript 前端开发 安全
TypeScript(TS)安装指南与基础教程学习全攻略(一)
TypeScript(TS)安装指南与基础教程学习全攻略(一)
36 0
|
8月前
|
JavaScript
【TS】You are currently running a version of TypeScript which is not officially supported by @typesc
【TS】You are currently running a version of TypeScript which is not officially supported by @typesc
247 2
|
8月前
|
前端开发 JavaScript 安全
【亮剑】探讨了在React TypeScript应用中如何通过道具(props)传递CSS样式,以实现模块化、主题化和动态样式
【4月更文挑战第30天】本文探讨了在React TypeScript应用中如何通过道具(props)传递CSS样式,以实现模块化、主题化和动态样式。文章分为三部分:首先解释了样式传递的必要性,包括模块化、主题化和动态样式以及TypeScript集成。接着介绍了内联样式的基本用法和最佳实践,展示了一个使用内联样式自定义按钮颜色的例子。最后,讨论了使用CSS模块和TypeScript接口处理复杂样式的方案,强调了它们在组织和重用样式方面的优势。结合TypeScript,确保了样式的正确性和可维护性,为开发者提供了灵活的样式管理策略。
85 0
|
8月前
|
JavaScript 前端开发 开发者
JavaScript(JS)和TypeScript(TS)的区别
JavaScript(JS)和TypeScript(TS)的区别
184 0
|
8月前
|
JavaScript 前端开发
【HarmonyOS 4.0 应用开发实战】TypeScript入门之模块化详讲
【HarmonyOS 4.0 应用开发实战】TypeScript入门之模块化详讲
86 0