typescript编译选项esModuleInterop的作用

esModuleInterop选项的作用是支持使用import d from 'cjs'的方式引入commonjs包。

引入commonjs模块的方式

无类型声明文件

如果一个模块没有类型声明,可以直接使用const cjs = require('cjs')的方式引入模块,此时cjs的类型是any

有类型声明文件

1.使用import cjs = require('cjs')方法引入

2.使用import * as cjs from 'cjs'方法引入,此时cjs相当于exports变量(虽然这能够正常工作,但其实不符合es模块规范,es模块规范规定cjs这个命名空间只能是一个纯对象,但是不能够直接调用,以koa举例)

import * as Koa from 'koa';
// 不符合规范
const app = new Koa();

// 编译后的结果
const Koa = require("koa");
const app = new Koa();

那怎么才能使用import cjs from 'cjs'语法呢?

首先你需要去除类型检查(允许从没有设置默认导出的模块中默认导入),这可以使用allowSyntheticDefaultImports配置项帮你达到。

其次你的导出需要有default属性,因为allowSyntheticDefaultImports只是帮你去掉类型检查,但是并不会影响编译后的代码输出,假设没有default属性,虽然可以正常编译,但是在运行时还是会报错的,这就需要esModuleInterop配置帮你完成了,因为对于大对数模块而言,并没有default属性。

esModuleInterop配置提供的帮助

提供两个helper函数__importStar__importDefault分别处理import * asimport default

例如对于下面的代码:

import * as foo from "foo";
import b from "bar";

编译后的结果:

"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
    result["default"] = mod;
    return result;
}
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
}
exports.__esModule = true;
var foo = __importStar(require("foo"));
var bar_1 = __importDefault(require("bar"));

可以看到会主动帮你设置default属性

allowSyntheticDefaultImports和esModuleInterop的关系

开启esModuleInterop后会默认开启allowSyntheticDefaultImports选项

### 如何将TypeScript编译成JavaScript 为了使TypeScript文件能够被广泛使用的JavaScript环境所理解和支持,需要通过特定的工具将其转换为目标版本的JavaScript代码。这一过程主要依靠TypeScript自带的编译器完成。 #### 安装TypeScript全局或本地 如果尚未安装TypeScript,则需先利用Node.js包管理工具npm来获取它。对于希望在整个系统范围内使用tsc命令的情况,可以采用如下方式全局安装: ```bash npm install -g typescript ``` 而对于那些倾向于保持项目独立性的开发者来说,在具体项目的根目录下执行以下指令以安装TypeScript作为开发依赖可能是更好的选择[^1]: ```bash npm install --save-dev typescript ``` #### 编写tsconfig.json配置文件 创建`tsconfig.json`文件有助于定义一系列编译选项,从而简化日常操作并确保团队成员间的一致性。此JSON格式的文档应当放置于工程顶层路径之下,并至少包含target属性指明期望输出的ES版本以及其他可能影响行为的关键字如module、strict等[^4]。 一个简单的例子如下所示: ```json { "compilerOptions": { "target": "es5", "module": "commonjs", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true } } ``` #### 使用`tsc`命令启动编译流程 一旦准备就绪,只需打开终端窗口并输入`tsc`即可触发整个工作空间内所有`.ts`结尾源码向对应同名`.js`目标产物转变的过程;当然也可以单独处理某个指定文件,方法是在上述基础上附加待加工对象的具体名称,像这样:`tsc filename.ts`。 值得注意的是,当存在有效的`tsconfig.json`设定时,默认情况下会自动采纳其中声明的各项参数而无需额外说明。此外,借助诸如Webpack之类的模块打包解决方案配合相应加载项(例如`ts-loader`),还可以实现更加复杂高效的自动化构建链路[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值