d.ts 声明模块在导入第三方库时不起作用

use*_*012 15 typescript visual-studio-code

在 d.ts 中通过 import 声明模块依赖第三方模块时,Vscode 提示“找不到模块”,有什么解决办法吗?

tsconfig.json

{
    "compilerOptions": {
        "outDir": "./dist/",
        "target": "es5",
        "lib": ["esnext", "dom.iterable","dom", "scripthost", "es2015.symbol"],
        "sourceMap": true,
        "noImplicitAny": true,
        "jsx": "react",
        "allowSyntheticDefaultImports": true,
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "allowJs": true,
        "module": "commonjs",
        "isolatedModules": false,
        "esModuleInterop": true
    },
    "include": ["src/**/*","typings/*"],
    "exclude": ["node_modules"]
}
Run Code Online (Sandbox Code Playgroud)

打字/index.d.ts

{
    "compilerOptions": {
        "outDir": "./dist/",
        "target": "es5",
        "lib": ["esnext", "dom.iterable","dom", "scripthost", "es2015.symbol"],
        "sourceMap": true,
        "noImplicitAny": true,
        "jsx": "react",
        "allowSyntheticDefaultImports": true,
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "allowJs": true,
        "module": "commonjs",
        "isolatedModules": false,
        "esModuleInterop": true
    },
    "include": ["src/**/*","typings/*"],
    "exclude": ["node_modules"]
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但无需导入即可正常工作

import * as moment from 'moment';

declare module 'someModule' {
    export function test(x: string): moment.CalendarKey;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

什么问题?

jus*_*ris 25

您需要将时刻导入放在以下位置declare module

declare module 'someModule' {
    import * as moment from 'moment';
    export function test(x: string): moment.CalendarKey;
}
Run Code Online (Sandbox Code Playgroud)

这是必需的,因为如果文件具有顶级导入或导出(docs),Typescript 会有不同的行为:

在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含顶级导入或导出的文件都被视为模块。相反,没有任何顶级导入或导出声明的文件被视为其内容在全局范围内可用的脚本(因此也适用于模块)。

当您在顶层添加导入时,它会将您的文件转换为模块,并且声明的范围仅限于该文件。当您将导入移至声明内时,Typescript 会将该文件视为脚本,并且声明可用于项目中的其他文件。

另外,请参阅具有类似问题的此问题:

如何在另一个环境模块中包含环境模块声明?

  • 这是给我解释的!我有一个带有导出命名函数的声明模块。当在顶层添加导入时,命名函数对消费者来说“消失”了。一旦我在声明中移动导入,它就会重新出现。 (2认同)