“resolveJsonModule”的用途?

问题描述 投票:0回答:1

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

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

我不太明白为什么TS语言工程师会为

"resolveJsonModule"
添加一个flag?环境支持通过
import
语句(或
require()
方法)将 JSON 解析为模块,或者环境不支持。为什么要费心额外的复杂性呢?


json typescript tsconfig
1个回答
12
投票

背景

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

标准化导入任何东西(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 并使用我自己手动编写的类型(由我自己或其他人编写:从模块/声明文件导入)作为数据,而不是依赖于编译器推断的类型import 语句(我发现在很多情况下都太窄了),通过使用类型断言将解析后的 JSON 数据分配给新变量。

© www.soinside.com 2019 - 2024. All rights reserved.