从TypeScript中的根路径导入模块

10 typescript typescript1.8 typescript2.0 typescript2.1 typescript2.2

我们假设我有一个项目,它的主要源目录是:

C:\product\src
Run Code Online (Sandbox Code Playgroud)

基于此目录,每个导入路径都与它相关.即,假设:

// Current script: C:\product\src\com\name\product\blah.ts

import { thing } from '/com/name/product/thing';
Run Code Online (Sandbox Code Playgroud)

与...一样:

// Current script: C:\product\src\com\name\product\blah.ts

import { thing } from '../../../com/name/product/thing';
Run Code Online (Sandbox Code Playgroud)

我的条目编译文件位于:

C:\product\src
Run Code Online (Sandbox Code Playgroud)

例如.那么,有没有办法C:\product\src在编译器选项中指定这样的输入路径(例如)?我需要在tsconfig.json文件中指定它,因为我将使用webpack.

我已经尝试过上面的示例,但TypeScript表示无法找到所请求的模块:

// Current script: A.ts

import { B } from '/com/B';


// Current script: B.ts

export const B = 0;
Run Code Online (Sandbox Code Playgroud)

我的tsconfig.json文件(在另一个项目中,但两者都相似):

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitReturns": true,
        "noImplicitThis": true,
        "noUnusedLocals": true,
        "preserveConstEnums": true,
        "removeComments": true,
        "sourceMap": true,
        "strictNullChecks": true,
        "target": "ES6"
    },

    "include": [
        "./src/**/*.ts",
        "./src/**/*.d.ts"
    ]
}
Run Code Online (Sandbox Code Playgroud)

Dam*_*een 13

我需要同时设置baseUrlrootDir指向我的 src 文件夹tsconfig.json

{
  "compilerOptions": {
    "baseUrl": "./src",
    "rootDir": "./src",
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后我可以导入 .tsx 文件而无需前缀“/”或相对路径。

例如 import BreadCrumb from 'components/BreadCrumb'

  • 这在 vscode linting 中有效,并且“tsc”可以很好地构建它,但是当我尝试运行编译后的代码时,我得到“找不到模块”。 (3认同)

小智 10

(重新发布我的答案以避免小狗插座.)

使用该compilerOptions.baseUrl属性我能够进行以下导入.这使我有了一个完整的root-to-expected-path,这有助于我的代码维护,并且可以在任何文件中工作,独立于当前文件夹.以下示例将我的项目的src文件夹作为模块根目录.

重要的建议:这个baseUrl属性不会影响条目webpack文件(至少对我来说?),所以用这个例子将src文件夹中的主文件分开,然后从条目(即import { Main } from './src/Main'; new Main;)中运行一次.

// browser: directory inside src;
//   * net: A TS file.
import { URLRequest } from 'browser/net';
Run Code Online (Sandbox Code Playgroud)

tsconfig.json示例:

{
    "compilerOptions": {
        "baseUrl": "./src",
        "module": "commonjs",
        "noImplicitReturns": true,
        "noImplicitThis": true,
        "noUnusedLocals": true,
        "preserveConstEnums": true,
        "removeComments": true,
        "sourceMap": true,
        "strictNullChecks": true,
        "target": "ES6"
    },

    "include": [
        "./src/**/*.ts",
        "./src/**/*.d.ts"
    ]
}
Run Code Online (Sandbox Code Playgroud)

但是,它不会直接与webpack一起使用.必须在webpack选项中完成同样的事情.这是它在webpack 2中的工作方式:

module.exports = {
  ...
  , resolve: {
      ...
      , modules: [ path.join(__dirname, './src') ]
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,回答但不要忘记也把node_modules放在那里. (4认同)

Ted*_*rne 7

TypeScript导入/在路径的开头使用以表示根目录.要导入相对于当前文件的文件,请不要使用初始斜杠或使用./.

// Current script: C:\product\src\com\name\product\blah.ts
import { thing } from './com/name/product/thing';
Run Code Online (Sandbox Code Playgroud)

默认情况下,TypeScript编译器假定项目的根与tsconfig.json的位置相同.

您可以通过在tsconfig中指定rootDir属性的compilerOptions属性来指定新的根.

有关所有可用属性设置的列表,请参阅此处的tsconfig定义.

  • **`/`总是指文件系统root.**[更多细节](/sf/answers/3236050611/) (3认同)
  • 感谢根目录的假设,但是我仍然无法导入相对于根目录的文件,因为 TypeScript 继续说导入模块不存在/找不到。我尝试过使用或不使用斜杠,但什么也没有,与“./”相同。 (2认同)