TypeScript:如何“找到”但无法解决模块?这与“ noResolution”有什么关系?

时间:2019-05-01 10:15:59

标签: typescript

当我使用--traceResolution在'proj'目录中运行tsc时,我看到模块'foo'已“成功解析”但没有“找到”:

======== Module name 'foo' was successfully resolved to 'C:/dev/ts-options/typings/foo/index.d.ts'. ========

main.ts(1,18): error TS2307: Cannot find module 'foo'.

在tsconfig.compilerOptions中设置"noResolve": true可以使错误消失。但是我很困惑!

问题1:“分辨率”和“查找”之间有什么区别?我以为这些是同义词

问题2:为什么“ noResolve”会影响此行为? noResolve实际上做什么? TS compiler options docs说:“请勿将三斜杠引用或模块导入目标添加到已编译文件列表中。”但我不知道那是什么意思。

具有此目录结构

  • / c / dev / ts-options /
    • 类型/
      • foo
        • index.d.ts
    • proj 这是我正在运行tsc的地方
      • tsconfig.json
      • main.ts

proj / tsconfig.json(如果将noResolve更改为false,则问题已修复)

{
    "compilerOptions": {
        "baseUrl": ".",
        "types": [],
        "outDir": "../out",
        "paths": {
            "foo": [
                "../typings/foo"
            ],
        },
        "noResolve": true
    },
    "include": [
        "**/*.ts",
    ],
    "exclude": [
        "node_modules"
    ]
}

proj / main.ts:

import foo from "foo"

typings / foo / index.d.ts:

declare function foo(num: number): number;
export default foo;

更新

两种解决方案:

  • 设置noResolve:false
  • 或在tsconfig的“ include”部分添加“ ../ typings”

我的猜测是,有一个“编译单元”的概念,例如:

  • 使用noResolve: false,则编译单元可以随着TS遵循import s而动态增长。

  • 使用noResolve: true,然后将编译单元固定为 类似于tsconfig.baseUrl/** + (tsconfig.include - tsconfi.exclude)

  • 当文件在编译单元外部时,TS可以“解析”导入(查找到.d.ts / .ts / .tsx文件的路径),但不会“查找”(实际读取文件)。

但是,这对我来说仍然没有任何意义。 “解决”到一个人们知道自己将无法“找到”的位置有什么意义?

1 个答案:

答案 0 :(得分:0)

此问题的原因是paths的{​​{1}}选项中的命名路径不正确。您正在定义一个名为tsconfig.json的路径,该路径指向相对于项目根目录的“ ../typings/foo”,但这是不正确的,因为它会转换为不存在的路径:

假设foo目录是这样的:

proj

然后结合定义的C:/dev/ts-options路径将其扩展为:

foo

这将导致不存在的路径:

C:/dev/ts-options/../typings/foo

该解析最终会通过查找所有目录来找到它,但是C:/dev/rp-build/node/rp-cli/test/fixtures/src/typescript/typings/foo使用import命名路径将其转换为上述错误的完整路径。

因此,有两种解决方案,要么在tsconfig.json中更正foo路径定义,要么在{{1}中使用指向foo / index.d.ts的main.ts的相对路径。 }这样的语句:

foo