当我使用--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说:“请勿将三斜杠引用或模块导入目标添加到已编译文件列表中。”但我不知道那是什么意思。
具有此目录结构
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
,则编译单元可以随着TS遵循import
s而动态增长。
使用noResolve: true
,然后将编译单元固定为
类似于tsconfig.baseUrl/** + (tsconfig.include - tsconfi.exclude)
。
当文件在编译单元外部时,TS可以“解析”导入(查找到.d.ts / .ts / .tsx文件的路径),但不会“查找”(实际读取文件)。
但是,这对我来说仍然没有任何意义。 “解决”到一个人们知道自己将无法“找到”的位置有什么意义?
答案 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