ts(typescript) 的模块化

本文围绕TypeScript模块化展开,介绍了模块化标准,建议统一用ES2015标准,还对比了编译结果,指出编译对象可兼容旧语法。同时探讨了解决默认导入问题的方法,讲解了在TS中书写CommonJS代码及类型检查的方式,最后介绍了TS的模块解析策略及配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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())

结果:
在这里插入图片描述

编译结果对比

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

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

  • ts 里面的代码使用的es6的导入和导出,编译的模块化是commonjs对比如下
    在这里插入图片描述
    在这里插入图片描述

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

解决默认导入问题

在index.ts中直接导入fs模块, 例如import fs from 'fs',但是结果确实报错的,如下:
在这里插入图片描述
编译的结果如下(虽然说报错了, 但是ts默认是可以编译的,这个可以通过配置来进行配置):
在这里插入图片描述
但是如何解决这个问题呢?

  • 方法一:按需导入
 import { readFileSync } from 'fs'
  readFileSync('./')

编译的结果如下:这个时可以正常使用的。
在这里插入图片描述

  • 方法二: 重命名的导入
import * as fs from 'fs'
fs.readFileSync('./')

在这里插入图片描述

  • 方法三:在ts.config.json中配置启用esModuleInterop 启用es模块化交互非es模块导出
import fs from 'fs'
fs.readFileSync('./')

在这里插入图片描述

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))

运行结果如下:
在这里插入图片描述
编译结果如下:

  • a.ts 文件
    在这里插入图片描述
  • index.ts 文件
    在这里插入图片描述

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模块导出

详细配置参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

twinkle||cll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值