如果有“import x = require(”x“);”

Typescript中的“声明合并”意味着“编译器正在将用相同名称声明的两个单独的声明合并为一个单一的定义”。

但是,我遇到一个情况,我不知道为什么这两个接口声明不能合并。

(环境是“visual studio 2015社区”+“用于Visual Studio的Node.js工具”(由Microsoft制作))

首先,有一个名为“b.ts”的文件,您可以在其中放入任何东西,只要确保b.ts ack作为模块(例如,至less有一个导出声明)。 另一个名为“a.ts”的文件,其内容如下:

b.ts

export var c; 

a.ts

 import a = require("b"); // ErrorConstructor is declared in the lib.d.ts from "Node.js Tools for Visual Studio". // // interface ErrorConstructor { // new (message?: string): Error; // (message?: string): Error; // prototype: Error; // } // // However, it lacks the prepareStackTrace property, so I added it, and // expect typescript could 'merge' this one with the original one. interface ErrorConstructor { prepareStackTrace: any; } function test() { var a = Error.prepareStackTrace; // The typescript complains that // Property 'prepareStackTrace' does not // exist on type 'ErrorConstructor'. } 

正如你在评论中看到的那样,typescript编译器会抱怨“Error.prepareStackTrace”不存在。

但是,如果我注释掉“import a = require(”b“)”行,那么错误已经消失了!

 //import a = require("b"); interface ErrorConstructor { prepareStackTrace: any; } function test() { var a = Error.prepareStackTrace; // <-- no error! } 

我不知道为什么typecript不能执行声明合并,如果有一个“导入X =要求(”X“);”。 任何人都可以帮助我吗? 谢谢。

http://basarat.gitbooks.io/typescript/content/docs/project/modules.html

如果在TypeScript文件的根级别有导入或导出,则会在该文件中创build本地作用域

我想我find了答案: https : //github.com/Microsoft/TypeScript/issues/2821#issuecomment-94093212

“通过添加导入或导出到您的文件中的顶级范围,您正在修改这个文件到一个模块。”

我想如果至less有一个“导出”,那么文件将成为一个模块(因为打字稿编译器将生成一个函数来包装文件内容)。 但是,通过这个评论,如果至less有一个“导入”,文件也将成为一个模块。