我可以导入*.d.ts而不是需要它吗?

Avo*_*vol 9 typescript typescript-typings

我有一些模块libnode_modules,我想使用它.我写的lib.d.ts是这个.

文件看起来像:

/src/
    main.ts (imports `lib`)
/types/
    lib.d.ts
Run Code Online (Sandbox Code Playgroud)

在文件中main.ts我可以写这段代码:

/// <reference path="../types/lib.d.ts" />
import {some} from 'lib';
Run Code Online (Sandbox Code Playgroud)

它有效.

但是当我尝试使用import for ambient declaration file时:

import '../types/lib';
import {some} from 'lib';
Run Code Online (Sandbox Code Playgroud)

它编译没有错误,但在生成JS我可以找到此文件的require:

require('../types/lib');
const lib_1 = require('lib');
Run Code Online (Sandbox Code Playgroud)

在丢失文件的运行时出错../types/lib- 它只是一个没有结果文件的环境声明文件.

为什么编译器没有删除*.d.ts文件的导入?
我可以以某种方式使用导入,或者我必须使用引用吗?

解:

如果您不想使用reference指令,则可以将所需的*.d.ts添加到tsconfig.json包含的文件中.

我的tsconfig.json是:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es2015",
        "lib": ["es2016"],
        "noImplicitAny": true,
        "noImplicitReturns": true,
        "noImplicitThis": true,
        "strictNullChecks": true,
        "noFallthroughCasesInSwitch": true,
        "noUnusedLocals": true,
        "noUnusedParameters": true,
        "noEmitOnError": true,
        "newLine": "LF",
        "forceConsistentCasingInFileNames": true,
        "removeComments": true,
        "declaration": false,
        "sourceMap": false,
        "outDir": "../build",
        "types": [
            "node"
        ]
    },
    "files": [
        "index.ts"
    ]
}
Run Code Online (Sandbox Code Playgroud)

早期我尝试将我的.d.ts添加到typessection,但在这种情况下,tcs尝试在node_modules/@ types目录中找到此文件.

建议后,我尝试在files部分中添加文件:

    "files": [
        "index.ts",
        "types/lib.d.ts"
    ]
Run Code Online (Sandbox Code Playgroud)

这是有效的,似乎是一个很好的解决方案.

Pal*_*leo 7

您没有import环境定义文件.

你可以手动/// <reference它.但正确的方法是通过文件使编译器可以使用它tsconfig.json.

其中一个例子tsconfig.json包括node_modules:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5"
    },
    "exclude": [
        "node_modules"
    ]
}
Run Code Online (Sandbox Code Playgroud)

文件在tsconfig.json这里.

  • 我如何确保它确实找到了 `d.ts` 文件?我应该会因为在 JS 库中使用我没有在 `d.ts` 文件中`declare` 的函数而得到错误,但我不是...... (4认同)
  • 感谢您的建议!我更喜欢使用“文件”而不是“排除”,但你给了我正确的方向。我更新了我的问题,添加了这个解决方案。 (2认同)