“resolveJsonModule”的目的?

JΛY*_*ÐΞV 10 json typescript tsconfig

我引用的设置显示在下面的代码片段中

{
  "compilerOptions": {
    "resolveJsonModule": true,
  }
}

Run Code Online (Sandbox Code Playgroud)

我不太明白为什么 TS 语言工程师会为 ? 添加一个标志"resolveJsonModule"?环境支持通过import语句(或require()方法)将 JSON 解析为模块,或者环境不支持。为什么要费心额外的复杂性呢?


jse*_*ksn 14

语境

从历史上看,Node 包含了一个专门的 JSON 加载器(与 ECMA 标准无关),以允许仅在 CommonJS 模式下导入 JSON 数据。

任何东西的标准化导入(ES 模块)只是 ECMAScript 中相对较新的现象。仍仅处于第 3 阶段的提案中描述了导入包含有效 JSON 并解析为原生 JS 数据的文本文件(“导入 JSON”)。

然而,最近在实施上述提案方面出现了一些进展:


打字稿

TypeScript 是一个静态类型检查器,也是一个编译器(技术上是转译器),并将 TS 源代码语法转换为对于您在 TSConfig 中指定的运行时环境有效的 JavaScript 语法。由于不同的运行时环境具有不同的功能,因此配置编译器的方式会影响发出的转换后的 JavaScript。关于默认值,编译器使用算法逻辑来确定设置。(我无法在这里总结这一点:老实说,您必须阅读整个 参考资料才能理解它。)因为直到最近,加载 JSON 数据一直是一种非标准的专门操作,所以它并不是默认操作。


备择方案

所有 JS 运行时都提供了import用于导入文本 JSON 数据(然后可以使用 解析JSON.parse)的语句的替代方案,并且它们都不需要按照您询问的方式配置编译器:

注意:从使用这些方法导入的 JSON 字符串解析的数据将不会参与编译器模块图的“自动”类型推断功能,因为它们不是编译图的一部分:因此它们将被键入为any(或可能unknown在极其严格的配置中)。

此外,由于所有 JSON(JavaScript 对象表示法)都是有效的 JS,因此您只需在 JSON 文件中的数据前面添加export default ,然后将文件保存为 ,data.js而不是data.json,然后将其导入为标准模块:import { default as data } from "./data.js";


关于推断类型的最后说明:

我更喜欢审核我导入的 JSON 并使用我自己手动编写的类型(由我自己或其他人编写:从模块/声明文件导入)作为数据,而不是依赖编译器从导入中推断出的类型语句(我发现在很多情况下都太窄了),通过使用类型断言将解析后的 JSON 数据分配给新变量。