104

假设我把我的代码src和测试放在下面spec

+ spec
+ --- classA.spec.ts
+ src
+ --- classA.ts
+ --- classB.ts
+ --- index.ts
+ tsconfig.json

我只想转换srcdist文件夹。由于index.ts是我的包裹的入口点,我的tsconfig.json样子是这样的:

{
  "compileOptions": {
    "module": "commonjs"
    "outDir": "dist"
  },
  "files": {
    "src/index.ts",
    "typings/main.d.ts"
  }
}

但是,这tsconfig.json不包括测试文件,因此我无法解决其中的依赖关系。

另一方面,如果我将测试文件包含在其中,tsconfig.json那么它们也会被转译到dist文件夹中。

我该如何解决这个问题?

4

6 回答 6

80

我最终定义了多个配置文件并用于extends简化它们。

假设我有两个文件:tsconfig.jsontsconfig.build.json

// tsconfig.json
{
  ...
  "exclude": [...]
}

// tsconfig.build.json
{
  ...
  "files": [ "typings/index.d.ts", "src/index.ts" ]
}

这样,我可以很好地控制要构建(使用tsc -p tsconfig.build.json)的内容和ts language service(IDE)处理的内容。

更新:现在随着我的项目的增长,我最终拥有了更多的配置文件。我使用 TypeScript 现在提供的“扩展”功能:

// tsconfig.base.json
{
  // your common settings. Mostly "compilerOptions".
  // Do not include "files" and "include" here,
  // let individual config handles that.
  // You can use "exclude" here, but with "include",
  // It's pretty much not necessary.
}

// tsconfig.json
{
  // This is used by `ts language service` and testing.
  // Includes source and test files.
  "extends": "./tsconfig.base.json",
  "atom": { ... },
  "compilerOptions": {
    // I set outDir to place all test build in one place,
    // and avoid accidentally running `tsc` littering test build to my `src` folder.
    "outDir": "out/spec"  
  }
  "include": [ ... ]
}

// tsconfig.commonjs.json or tsconfig.systemjs.json or tsconfig.global.json etc
{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    // for some build this does not apply
    "declaration": true/false,
    "outDir": "dist/<cjs, sys, global, etc>",
    "sourceRoot": "..."
  },
  // Only point to typings and the start of your source, e.g. `src/index.ts`
  "files": [ ... ],
  "include": [ ... ]
 }
于 2016-05-31T20:43:41.810 回答
42

这是管理源和测试的详细解决方案:

  • 编译包括源和测试文件夹/文件
  • build 仅包含源
  • IDE(VSCode,...)

配置

该解决方案基于tsconfig.json其他答案中提到的 2 个文件。

主要./tsconfig.json(用于编译和IDE):

{
  "compileOptions": {
    "module": "commonjs"
    "outDir": "dist"
  },
  "include": [
    "spec/**/*.spec.ts"
  ],
  "files": [
    "src/index.ts"
  ]
}

第二个./tsconfig-build.json(用于构建):

{
  "extends": "./tsconfig.json",
  "exclude": [
    "spec/**/*.spec.ts"
  ]
}

注意:我们排除了之前包含的测试文件

建造

构建命令:tsc -p tsconfig-build.json

或者npm run build如果脚本被添加到package.json

{
  "scripts": {
    "build": "tsc -p tsconfig-build.json",
}

于 2020-02-14T09:55:06.463 回答
15

这在某种程度上取决于您使用的任何测试框架,但我喜欢使用ts-node来编译我的测试文件。使用 mocha,您的npm test脚本可能如下所示:

"mocha": "mocha test/ --compilers ts:ts-node/register --recursive"

在您的 tsconfig.json 中,确保删除该rootDir选项。

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6",
        "noImplicitAny": false,
        "removeComments": true,
        "sourceMap": true,
        "outDir": "lib"
    },
    "include": [
        "src/**/*.ts"
    ],
    "exclude": [
        "node_modules",
        "lib",
        "typings/**"
    ]
}

当您尝试使用rootDir设置为src或应用程序代码的任何基本文件夹运行 typescript 时,它将不允许在位于外部的目录中进行任何编译,例如tests. 使用ts-node,您可以轻松地将所有内容分开,而不必拥有单独的 TypeScript 配置文件。

于 2016-12-11T09:40:08.843 回答
2

我认为您不应该在配置中使用“文件”选项。相反,您可以排除不需要的文件并拥有它:

{ 
    "compilerOptions": { 
        "module": "commonjs", 
        "outDir": "dist"
    },
    "exclude": [
        "node_modules",
        "dist",
        "typings/browser.d.ts",
        "typings/browser/**"
    ]
} 

这会将您的原始结构保留在“dist”文件夹中,而不会混合测试和应用 js 文件:

--dist
----spec
-------....
----src
-------....
于 2016-02-18T07:48:05.077 回答
1

只需添加要编译并包含在构建中的源文件的包含目录。接下来,在 tsconfig.json 中指定您的排除目录。对于您的用例,没有必要拥有多个 tsconfig 文件。

{
  "include": [ "src/**/*" ],
  "exclude": [ "./spec" ]
}
于 2021-04-02T16:50:25.090 回答
0

对我来说,这是因为我的 jest 版本是 26,而我的 ts-jest 版本是 27,所以它们不同步。

yarn jest --version
yarn add ts-jest@26

我的 jest.config.js

module.exports = {
    preset: "ts-jest",
    moduleFileExtensions: ["ts", "tsx", "js", "jsx"],
    transform: {
        "^.+\\.tsx?$": "ts-jest",
    },
    globals: {
        "ts-jest": {
            diagnostics: false,
        },
    },
    testMatch: ["**/*.(test|spec).(ts|tsx|js|jsx)"],
    coveragePathIgnorePatterns: ["/node_modules/"],
    coverageReporters: ["json", "lcov", "text", "text-summary"],
    transformIgnorePatterns: [
        "<rootDir>/node_modules/(?!(firebase/.*|react/.*)/)",
    ],
    testEnvironment: "jest-environment-jsdom-sixteen",
    moduleNameMapper: {
        "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$":
            "<rootDir>/__mocks__/mocks.js",
        "\\.(css|less|scss)$": "<rootDir>/__mocks__/mocks.js",
        "^src/(.*)": "<rootDir>/src/$1",
    },
};

于 2021-08-22T06:19:08.447 回答