我似乎无法说服VSCode解析绝对的TypeScript模块路径。相对路径有效,但绝对不行。我希望VSCode解析来自./src
文件夹的模块路径。
// this works when source file is in /src/here/there/file.ts
// and importing an interface in /src/api/interfaces.ts
import { Interface } from '../../api/interfaces';
// this doesn't work
import { Interface } from 'api/interfaces';
import { Interface } from '/api/interfaces';
import { Interface } from 'src/api/interfaces';
import { Interface } from '/src/api/interfaces';
// this works but is of course not supposed to be used
import { Interface } from 'c:/..../src/api/interfaces';
最后一个当然不算数,因为每个开发人员的项目路径很可能不同。但即使我们都设置了系统变量%ProjectXRoot%
,我们也无法在代码中使用此变量。 VSCode不会解析此类模块路径。我试过了。
// won't work
import { Interface } from '%ProjectXRoot%/api/interfaces';
当前安装的版本
•TypeScript:1.8.10
•VSCode:1.1.1
我试图以某种方式配置VSCode来解析绝对模块路径,但似乎无法这样做。我已经尝试通过在两个不同的地方添加baseUrl
来配置 tsconfig.json (在项目根目录中)。
{
...
"compilerOptions": {
"baseUrl": "./src", // doesn't work
...
},
"baseUrl": "./src", // doesn't work either
...
}
我已经尝试了src
,./src
和./src/
之类的值,但它们都不适用于任何上层配置位置。
那么如何配置VSCode 来解析某个文件夹中的绝对模块路径?
如果不可能,从项目根目录解析绝对路径至少会更好。我不知道VSCode如何确定?它是打开文件夹的位置还是 .vscode 文件夹所在的位置?不知道。但它仍然是绝对路径的可行解决方案。我尝试使用类似于VS的~
,但也无济于事。
正如@steinso在答案中指出的那样,所有以/
,./
或../
开头的模块都被认为是相对的。特别是第一个让我感到惊讶,因为我通常认为项目的根相对路径。但这个事实基本上意味着主要问题现在变成:如何提供模块导入作为绝对路径 (来自某些项目 root文件夹路径)呢?带斜杠的起始路径通常意味着绝对,但在这种情况下它并不是。
即使我将编译器选项moduleResolution
设置为classic
(因此模块解析不会查看node_modules
文件夹),上面的第二组导入实际应该全部工作根据Microsoft的链接文档。但由于某些原因,我仍然在VSCode中获得红色波浪线并在编译期间出现错误。
那么我如何导入特定的项目模块而不提供精确的相对路径,而只是它自己的项目相对路径?
答案 0 :(得分:20)
为了能够使用VSCode在typescript中使用导入的绝对路径,你应该使用下一版本的typescript - typescript@next
,这是typescript v2。为此,请执行以下操作:
通过npm安装typescript @ next,用于安装typescript v2.x
npm i typescript@next -D
在VSCode中
i)转到文件>偏好>工作区设置 [这会在项目根目录生成.vscode
目录并初始化settings.json
文件]
ii)将以下key:value
对放入settings.json
文件
"typescript.tsdk": "node_modules/typescript/lib"
在tsconfig.json
中添加以下关键字:值对'compilerOptions'
{
"compilerOptions" : {
"baseUrl": "./",
"paths" : {
"src/*": ["./src/*"]
}
}
}
如果您有以下目录结构:
+ node_modules
+ src
| + app
| | + shared
| | | -service.ts
| | -main.ts
+ typings
- tsconfig.json
- webpack.config.json
- package.json
- index.html
然后从[{1}}导入/src/app/shared/service.ts
您现在可以main.ts
;
如果您使用import {} from 'src/app/shared/service
和webpack
来转发ts-loader
文件,则应将其添加到.ts
配置文件的resolve
部分。
webpack.config.js
请参阅this了解绝对模块分辨率。
答案 1 :(得分:6)
您需要指定:
"compilerOptions": {
"moduleResolution": "classic"
...
然后基本路径将默认为tsconfig.json的目录,在compilerOptions中添加编辑:这似乎没有任何影响。rootDir
以更改它。
这将允许导入,例如:
import { Interface } from 'api/interfaces';
请注意,以.
或../
或/
开头的所有路径都被视为相对路径。
修改:模块解析
请注意模块的解析方式。模块路径仍然是一些相对于当前文件的路径。
让我们用一个例子来说明当前的情况:
让我们从源文件import { Interface } from "api/interfaces"
说出/src/views/View.ts
。然后,Typescript将在以下路径中查找模块:
api/interfaces.ts
api/interfaces.ts
api/interfaces.ts
注意:这仍然是如何使它相对的,想象一下当import {Home} from "Home/Home"
位于/src/views/View.ts
时/src/views/Home/Home
。在这种情况下,即使路径为Home/Home
,它也会起作用。
这些是可能的解决方案:
Home/Home
- >请注意这是如何工作的。Home/Home
package com.foodsmap_project_app.foodsmap_project_app;
public class FoursquareVenue
{
private String name;
private String city;
private String category;
public FoursquareVenue() {
this.name = "";
this.city = "";
this.setCategory("");
}
public String getCity() {
if (city.length() > 0) {
return city;
}
return city;
}
public void setCity(String city) {
if (city != null) {
this.city = city.replaceAll("\\(", "").replaceAll("\\)", "");
;
}
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
可在此处找到更多信息: http://www.typescriptlang.org/docs/handbook/module-resolution.html
答案 2 :(得分:2)
对于其他来这里的人,如果您正确设置了路径:
{
…
"compilerOptions": {
…
"baseUrl": ".",
"paths": {
"~/*": ["app/assets/javascript/*"],
"*": ["node_modules/*", "app/assets/javascript/packs/*"]
}
}
}
您仍然遇到问题,也许尝试重新加载vscode:cmd
+ shift
+ P
并键入reload window
。
它只是随机地停止为我工作并报告问题。我在网上花了大约20分钟的时间试图弄清楚发生了什么变化,才意识到VS Code可能会干扰绝对路径分辨率。