TypeScript Importing JSON,他们以这种方式导入 JSON 有任何隐藏的缺点吗

TypeScript Importing JSON, are their any hidden drawbacks to importing JSON this way

"resolveJsonModule"背后的原因是什么?


我正在用 TypeScript 编写 Node.js 模块。我对节点并不陌生,但最近才学习如何编写 JS w/Types。目前,我正处于需要解析一些 JSON 文件的地步。我立即注意到 在 TypeScript 中导入 JSON 并不像使用标准 JavaScript[= 编写 Node 模块时那样简单84=]。使用 JS,只需使用 require 即可导入 JSON 文件。

  • const data = require('.../sum-json-file.json');

阅读下面的资源后,我发现 TS 在 ts 配置文件中实现了一个设置,tsconfig.json,允许 TS 转换为上面代码段中的语法。

Hackernoon.com Article


有效的 TypeScript 配置:

大多数示例不包括获取要解析的 JSON 文件的输入所需的所有设置,但 tsc 编译器具有变得如此冗长,google 真的不需要弄清楚如何以这种方式导入 JSON。
{
  "compilerOptions": {
    "module": "CommonJS",
    "moduleResolution": "Node",
    "resolveJsonModule": true,
    "esModuleInterop": true,
  }
}


我无法理解“resolveJsonModule”设置背后的原因。

Why not just support the importation of JSON files via an import statement?

问题或文章均未提及为什么需要设置 ("resolveJsonModule") 以 add/remove 支持导入 JSON 文件通过 import 关键字和 require(...) 方法。此外,我无法得出为什么设置 "resolveJsonModule" 默认不打开,我不明白为什么每个项目都要求我设置 "resolveJsonModule"true.



关注原因

我问的原因是因为我担心使用 import/require(...) 导入 JSON[= 可能会有缺点81=] 我不知道的文件。我不知道他们是不是,但我怀疑他们添加了一个用于打开和关闭该功能的设置,只是为了好玩,显然,编程不能那样工作。



将其转化为问题形式:

将设置 "resolveJsonModule" 添加到 tsconfig.json 文件的原因是什么,为什么 TypeScript 不支持通过 [=19= 导入 JSON 文件] 关键字,而没有用于打开它的设置。他们使用 "resolveJsonModule" 的缺点吗?


上下文

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

标准化 导入任何东西(ES 模块)在 ECMAScript 中只是一个相对较新的现象。导入包含有效 JSON 的文本文件,解析为原生 JS 数据(“导入 JSON”)在 a proposal that is still only in stage 3.

中描述

但是,最近在执行上述提案方面出现了一些进展:


TypeScript

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


备选方案

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

Note: the data parsed from the JSON strings imported using these methods will not participate in the "automatic" type inference capabilities of the compiler module graph because they aren't part of the compilation graph: so they'll be typed as any (or possibly unknown in an extremely strict configuration).

Additionally, because all JSON (JavaScript Object Notation) is valid JS, you can simply prepend the data in your JSON file with export default , and then save the file as data.js instead of data.json, and then import it as a standard module: import {default as data} from './data.js';.


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

我更喜欢审核我正在导入的 JSON 并使用我自己的 manually-written 类型(由我自己或其他人编写:从 module/declaration 文件导入)数据,而不是依赖编译器从 import 语句推断的类型(我发现在很多情况下它太窄),方法是使用 type assertion.[ 将解析的 JSON 数据分配给新变量。 =37=]