VSCode typescript导入json文件高亮问题

Posted

技术标签:

【中文标题】VSCode typescript导入json文件高亮问题【英文标题】:VSCode typescript importing json file highlighting issue 【发布时间】:2019-02-17 04:48:03 【问题描述】:

在使用 VSCode 时使用 typescript 中的 import 语句导入 json 文件时,我有一些奇怪的行为。请注意,这不是打字稿本身的问题,只是 VSCode 突出显示。

我已经编辑了我的 tsconfig.json,将值为 true 的 resolveJsonModule 和 esModuleInterop 添加到我的编译器选项中,以便在 typescript 中导入 json。

我也将此包添加到我的项目中 https://www.npmjs.com/package/json-d-ts 并向 tsconfig.json 添加了一个 typeRoots 属性,其值为 ["node_modules/json-d-ts"]

我已将 json 文件(位于 src/config/firebaseServiceKey.json)导入到父目录中的模块(位于 src/firebaseApp.ts)中,因此导入如下所示:

import databaseUrl from "./config/firebaseDatabaseURL.json";

VSCode 不会抱怨这个导入:

但是我有另一个模块在项目目录的不同级别导入相同的文件,这个模块在 test/utils.ts 中找到,它的导入看起来像这样:

import serviceKey from "../src/config/firebaseServiceKey.json";

这一次 VSCode 似乎不喜欢相对导入,并将模块突出显示为缺失:

任何想法如何解决配置 VSCode 以解决此问题?

这里是运行 tsc --traceResolution 结果的相关部分:

======== Resolving module '../src/config/firebaseServiceKey.json' from '/home/jty/April2018/vs-server/test/utils.ts'. ========
Explicitly specified module resolution kind: 'NodeJs'.
Loading module as file / folder, candidate module location '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json', target file type 'TypeScript'.
File '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json.ts' does not exist.
File '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json.tsx' does not exist.
File '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json.d.ts' does not exist.
Directory '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json' does not exist, skipping all lookups in it.
Loading module as file / folder, candidate module location '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json', target file type 'javascript'.
File '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json.js' does not exist.
File '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json.jsx' does not exist.
Directory '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json' does not exist, skipping all lookups in it.
Loading module as file / folder, candidate module location '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json', target file type 'Json'.
File '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json' exist - use it as a name resolution result.
======== Module name '../src/config/firebaseServiceKey.json' was successfully resolved to '/home/jty/April2018/vs-server/src/config/firebaseServiceKey.json'. ========

这是我的 tsconfig.json


"compilerOptions": 
    "module": "commonjs",
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "target": "es6",
    "noImplicitAny": true,
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "baseUrl": ".",
    "paths": 
        "*": [
            "node_modules/*",
            "src/types/*"
        ]
    
,
"include": [
    "src/**/*"
],
"typeRoots": [
    "node_modules/json-d-ts"
  ]

【问题讨论】:

首先,根据tsconfig.json 中的filesincludeexclude 设置确保包含test/utils.ts,因为VS Code 不应用指定的编译器选项在tsconfig.json 中排除的文件。如果这不是问题,请使用 --traceResolution 选项运行 tsc 以获取有关尝试解析 ../src/config/firebaseServiceKey.json 模块时发生的情况的更多信息。 这个问题可能是因为你试图在你的 TypeScript 项目目录之外导入一个 JSON 文件 嗨,谢谢马特,我已经为相关部分添加了我的 tsconfig.json 和 tsc 的结果,我认为它不是打字稿问题,因为它确实解决了模块和代码工作。但是 vscode 似乎没有那么聪明地解析模块。 事实上,如果 test/* 放在 tsconfig.json 中的“include”中,则构建失败并显示:“error TS2497: Module '”/home/jty/April2018/vs-server/src /config/firebaseServiceKey"' 解析为非模块实体,无法使用此构造导入。"否则,如果它不包括在内,那么它编译得很好。无论哪种方式,VSCode 都会抱怨。 【参考方案1】:

我遇到过类似的问题,请检查您的文件是否包含在 @Matt McCutchen 所说的内容中,该文件包含 import serviceKey from "../src/config/firebaseServiceKey.json"; 如您在tsconfig.json 中所述,应包含在src 文件夹下

"include": [
    "src/**/*"
],

在我的例子中,它是一个测试文件,应该包含在构建中。因此,我决定忽略 vs. 中的那个亮点。

// @ts-ignore
import packageJson from '../../../../package.json';

【讨论】:

以上是关于VSCode typescript导入json文件高亮问题的主要内容,如果未能解决你的问题,请参考以下文章

VSCode for MacOS 中的 Typescript 导入不正确

如何阻止从不应该的文件夹导入vscode typescript文件?

VSCode配置TypeScript

Typescript:导入导入json文件的js库

将数组从 JSON 文件导入 Typescript 文件

Typescript Vue 的 VSCode 智能感知(@Component 自动导入)