tsconfig之esModuleInterop属性

2023-10-31

背景

如下代码

import fs from 'fs';

fs.copyFile('');

esModuleInteropfalse 时,typescript 提示报错如下 TS1192: Module '"fs"' has no default export.

为什么会出现这种报错呢,因为 fs 模块的确没有默认导出。因为 fs 是遵循 cjs 规范写的。即类似于这种导出:

module.exports = fs = {
  copyFile,
  copyFileSync,
}

如何解决

方案一

使用如下方式导入 fs

import * as fs from 'fs'

fs.copyFile('');

可以看下两种不同的导入方式编译后的结果

编译前

import fs from 'fs';
import * as fsBak from 'fs';

fs.copyFile('', '', () => {});
fsBak.copyFile('', '', () => {});

编译后

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = require("fs");
const fsBak = require("fs");
fs_1.default.copyFile('', '', () => { });
fsBak.copyFile('', '', () => { });

看到编译后的结果可以发现使用 import fs from 'fs'; 进行导入的,最终编译调用方法时,会从 default 属性中去调用方法,
因为 import 的默认导入认为模块的导出是使用 export default 进行的。但如果是 commonjs 模块它们并不是这样的。
所以 fs_1.default.copyFile 是不存在的。

方案二

开启 esModuleInteroptrue

编译前

import fs from 'fs';

fs.copyFile('', '', () => {});

编译后

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
  return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
fs_1.default.copyFile('', '', () => { });

可以看出 typescript 生成了一个 __importDefault 函数,它的作用是:
如果目标模块是 esm,就直接返回目标模块;否则将目标模块挂在一个对象的 default 上,返回该对象

var __importDefault = (this && this.__importDefault) || function (mod) {
  return (mod && mod.__esModule) ? mod : { "default": mod };
};

编译前

import * as fsBak from 'fs';

fsBak.copyFile('', '', () => {});

编译后

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
  if (k2 === undefined) k2 = k;
  var desc = Object.getOwnPropertyDescriptor(m, k);
  if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    desc = { enumerable: true, get: function () { return m[k]; } };
  }
  Object.defineProperty(o, k2, desc);
}) : (function (o, m, k, k2) {
  if (k2 === undefined) k2 = k;
  o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
  Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function (o, v) {
  o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
  if (mod && mod.__esModule) return mod;
  var result = {};
  if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
  __setModuleDefault(result, mod);
  return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const fsBak = __importStar(require("fs"));
fsBak.copyFile('', '', () => { });

可以看出 typescript 生成了一个 __importStar 函数,它的作用是:

  • 如果目标模块是 esm,就直接返回目标模块
  • 否则将目标模块上所有的除了 default 以外的属性挪到 result
  • 将目标模块自己挂到 result.default

总结

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tsconfig之esModuleInterop属性 的相关文章

随机推荐

  • Gitlab fork and code review 流程

    Gitlab fork and code review 1 CodeReview的目的 CodeReview的目的是提升代码质量 尽早发现潜在缺陷与BUG 降低修复成本 同时促进团队内部知识共享 帮助更多人更好地理解系统 2 git for
  • Qt 中的智能指针

    Qt 中的智能指针 上一篇博客中介绍了 C 11 标准中的提供的智能指针 在 Qt 中也提供了类似的替代功能 并且比 C 11 标准中提供的功能还要强大 所以如果我们使用 Qt 作为基础库 那么就没有必要使用C 11 的智能指针 Qt 的智
  • 【参考设计】CH340最新官方原理图2020-4-1

    USB转串口 最新精简原理图如下 CH340G CH340E CH340N CH340K
  • 蓝牙HCI 部分Command,Event

    一 HCI层 1 HCI Reset 将HCI复位到初始状态来重新初始化HCI层 2 HCI Read Buffer Size 读取HCI的缓冲区大小 以便确定其能够处理的数据量与数据 3 HCI Host Buffer Size 定义Ho
  • H3C 各类路由默认优先级

    转载于 https www cnblogs com fanweisheng p 11156746 html
  • 微信商城小程序怎么开通?

    随着移动互联网的快速发展 微信商城小程序成为了越来越多企业开启电商新模式的首选之一 微信商城小程序不仅在运营方式上具有很大优势 还能够提供更加便利和舒适的购物体验 那么微信商城小程序怎么开通呢 下面 我们将简单介绍微信商城小程序的开通流程
  • 神经网络与人工智能

    首先要简单区别几个概念 人工智能 机器学习 深度学习 神经网络 这几个词应该是出现的最为频繁的 但是他们有什么区别呢 来一张图就比较清楚了 如下图 人工智能 人类通过直觉可以解决的问题 如 自然语言理解 图像识别 语音识别等 计算机很难解决
  • 【数据库CS751:事务处理Transaction Processing,如何为远程并发访问的系统安全地执行组合更新】——并发性、锁与隔离

    目录 一 前言 二 并发性 1 数据库使用的典型架构 2 并发性 lt 1 gt 不相交数据事务 lt 2 gt Disjoint access parallelism DAP 不相交数据库并行 如何分辨数据的不相交性 3 并发性的解决 一
  • VTK-6.3.0编译(支持Qt编程)以及QVTKwidget插件安装

    重新整理一下VTK编译过程 尤其是涉及到Qt方面的选项配置 计算机系统 win10 x64 VTK版本 VTK 6 3 0 Qt版本 Qt 5 4 2 msvc 2013 x64 opengl Cmake版本 Cmake3 5 第一步 创建
  • 【结构与算法】—— 数据结构代码总结

    博客主页 https blog csdn net dxt19980308 欢迎点赞 收藏 留言 如有错误敬请指正 本文由肩匣与橘编写 首发于CSDN 生活依旧是美好而又温柔的 你也是 目录 线性表 1 1 顺序表 1 1 1 顺序表定义 1
  • CiteSpace关键词分析的可视化处理(三)

    1 调整好参数等 点击Go 运行 得到可视化窗口后 如下 进入可视化界面后 可以先点击a图标 进行聚类 如果得到的效果不好 可以点击聚类图标后面的T K或A来以不同的方式进行聚类 也可以点击LSI LLR MI USR用不同的算法来进行聚类
  • C程序编译过程浅析

    文章转载自 http smilejay com 2012 01 c compilation stages 前几天看了 程序员的自我修养 链接 装载与库 中的第二章 编译和链接 主要根据其中的内容简单总结一下C程序编译的过程吧 我现在一般都是
  • c++中函数参数传递(值传递、指针传递,引用传递)进一步认识

    ps 今天想写一个函数 从函数中把我需要的两个值传出来 由于传出来的值比较多 所以不考虑用return来返回 需要通过参数把修改后的值拉出来供我使用 很当然的就想到了用指针 但是值就是传不出来 使我对原有的大脑中指针的思维产生混沌感 今天一
  • 以太坊2.0 主网节点搭建最新详细教程

    文章目录 一 搭建准备 1 1 配置 JWT 身份验证 二 部署执行节点geth 2 1 下载geth基础镜像 2 2 geth容器生成 三 部署共识节点Prysm 3 1 下载Prysm镜像 3 2 Prysm容器生成 四 检查节点是否同
  • 12.基于栈的指令集与基于寄存器的指令集

    通过一个算术代码来了解栈的解释器执行过程 基于栈指令集Demo 演示1 1基于栈的指令集 iconst 1 iconst 1 iadd istore 0 两条iconst 1指令连续把两个常量压入栈后 iadd指令把栈顶的两个值出栈 相加
  • 7-10 计算工资 (15 分) 基础编程题目集(C语言)

    基础编程题目集 返回 7 10 计算工资 15 分 某公司员工的工资计算方法如下 一周内工作时间不超过40小时 按正常工作时间计酬 超出40小时的工作时间部分 按正常工作时间报酬的1 5倍计酬 员工按进公司时间分为新职工和老职工 进公司不少
  • Java class located out of the source root

    Source root 可以理解为源目录 源码的作用就是用来专门放 Java 类文件 相对于编译出来的 class 文件而言 它就是源 我们一般默认名字叫 src 的目录就是源目录 但是其实并不是这样的 在 IntelliJ IDEA 中
  • no-referrer-when-downgrade什么意思

    no referrer when downgrade的意思 降级时不推荐 从一个网站链接到另外一个网站会产生新的http请求 referrer是http请求中表示来源的字段 no referrer when downgrade表示从http
  • java 高效遍历map_精髓!Java中遍历Map集合的五种方式

    在java中所有的map都实现了Map接口 因此所有的Map都可以用以下的方式去遍历 这篇文章主要给大家介绍了关于Java中遍历Map集合的5种方式 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下
  • tsconfig之esModuleInterop属性

    背景 如下代码 import fs from fs fs copyFile 当 esModuleInterop 为 false 时 typescript 提示报错如下 TS1192 Module fs has no default expo