我引用的设置显示在下面的代码片段中
{
"compilerOptions": {
"resolveJsonModule": true,
}
}
我不太明白为什么TS语言工程师会为
"resolveJsonModule"
添加一个flag?环境支持通过 import
语句(或 require()
方法)将 JSON 解析为模块,或者环境不支持。为什么要费心额外的复杂性呢?
从历史上看,Node 包含了一个专门的 JSON 加载器(与 ECMA 标准无关),以允许导入 JSON 数据仅在 CommonJS 模式下。
标准化导入任何东西(ES模块)只是ECMAScript中相对较新的现象。 仍处于第 3 阶段的提案中描述了导入包含有效 JSON 的文本文件,解析为原生 JS 数据(“导入 JSON”)。
但是,最近在实施上述提案方面出现了一些进展:
v4.5.0
于2021年11月实施v1.17.0
于2021年12月实施v16.14.0
于 2022 年 2 月实现了它(在 CLI 标志--experimental-json-modules
后面)TypeScript 是一个静态类型检查器,也是一个编译器(技术上是转译器),并将 TS 源代码语法转换为对于您在 TSConfig 中指定的运行时环境有效的 JavaScript 语法。由于不同的运行时环境具有不同的功能,因此配置编译器的方式会影响发出的转换后的 JavaScript。关于默认值,编译器使用算法逻辑来确定设置。 (我不能在这里总结这一点:老实说,你必须阅读整个参考才能理解它。)因为加载JSON数据一直是一个非标准的、专门的操作,直到最近,它不是默认值。
所有 JS 运行时都提供了
import
语句的替代方案,用于导入文本 JSON 数据(然后可以使用 JSON.parse
进行解析),并且它们都不需要按照您询问的方式配置编译器:
注意:使用这些方法导入的 JSON 字符串解析的数据将不会参与编译器模块图的“自动”类型推断功能,因为它们不是编译图的一部分:因此它们将被键入为
(或者在极其严格的配置中可能是any
)。unknown
window.fetch
Deno.readTextFile
fs.readFile
此外,由于所有 JSON(JavaScript 对象表示法)都是有效的 JS,因此您只需在 JSON 文件中的数据前面加上
,然后将文件另存为export default
而不是data.js
,然后将其导入为标准模块:data.json
.import { default as data } from "./data.js";
有关推断类型的最终说明:
我更喜欢审核我导入的 JSON 并使用我自己手动编写的类型(由我自己或其他人编写:从模块/声明文件导入)作为数据,而不是依赖于编译器推断的类型import 语句(我发现在很多情况下都太窄了),通过使用类型断言将解析后的 JSON 数据分配给新变量。