VSCode

时间:2016-06-03 05:28:14

标签: module typescript visual-studio-code

我似乎无法说服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中获得红色波浪线并在编译期间出现错误。

那么我如何导入特定的项目模块而不提供精确的相对路径,而只是它自己的项目相对路径?

3 个答案:

答案 0 :(得分:20)

为了能够使用VSCode在typescript中使用导入的绝对路径,你应该使用下一版本的typescript - typescript@next,这是typescript v2。为此,请执行以下操作:

  1. 通过npm安装typescript @ next,用于安装typescript v2.x

    npm i typescript@next -D

  2. 在VSCode中

    i)转到文件>偏好>工作区设置 [这会在项目根目录生成.vscode目录并初始化settings.json文件]

    ii)将以下key:value对放入settings.json文件

    "typescript.tsdk": "node_modules/typescript/lib"

  3. tsconfig.json中添加以下关键字:值对'compilerOptions'

  4. {
      "compilerOptions" : {
        "baseUrl": "./",
        "paths" : {
          "src/*": ["./src/*"]
        }
      }
    }
    
    1. 重新载入VSCode
    2. 如果您有以下目录结构:

      + 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/servicewebpack来转发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将在以下路径中查找模块:

  1. / SRC /视图/ api/interfaces.ts
  2. / SRC / api/interfaces.ts
  3. / api/interfaces.ts
  4. 注意:这仍然是如何使它相对的,想象一下当import {Home} from "Home/Home"位于/src/views/View.ts/src/views/Home/Home。在这种情况下,即使路径为Home/Home,它也会起作用。

    这些是可能的解决方案:

    1. / src / views / Home/Home - >请注意这是如何工作的。
    2. / SRC / Home/Home
    3. / 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; } }
    4. 可在此处找到更多信息: 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可能会干扰绝对路径分辨率。