TypeScript如何在每个文件中声明全局变量?

TypeScript如何在每个文件中声明全局变量?,typescript,Typescript,我想定义一个全局可用的助手 global.p = console.log.bind(console) 因此,我可以使用p('some message')而不是console.log('some message') 但是TypeScript抱怨p未定义。有没有办法告诉TypeScript编译器每个文件中都有一个全局变量p?智能移动以抽象日志记录,这样您就不会在整个程序中产生直接依赖于console.log的代码 您可以声明它已全局存在: declare var p: (message: any,

我想定义一个全局可用的助手

global.p = console.log.bind(console)
因此,我可以使用
p('some message')
而不是
console.log('some message')


但是TypeScript抱怨
p
未定义。有没有办法告诉TypeScript编译器每个文件中都有一个全局变量
p

智能移动以抽象日志记录,这样您就不会在整个程序中产生直接依赖于
console.log
的代码

您可以声明它已全局存在:

declare var p: (message: any, ...additionals: any[]) => void;
但是,如果必须在每个文件中都放置此文件,您还可以:

import { p } from './logging';
通过使用
控制台.log
包装器制作日志模块。

从'@angular/core'导入{Injectable};
@可注射()
出口级全球状态{
私人状态:任何;
构造函数(){
此状态为.\u状态={
“GlobaConfigVersion”:“0.0.0”
}
}
getStatusValue(valKey:string):任意{
返回此。_状态[valKey];
}
setStatusValue(valKey:string,theStatus:any):any{
这个状态[瓦尔基]=状态;
}

}
如果您只是想告诉TypeScript您的p变量可以,您可以在文件的开头声明它:

声明var p:any;

我想我知道您想做什么-您希望typescript理解
p
变量是在全局范围内设置的,而不必在每个文件中从…
导入{p}

如果我没有弄错的话,您需要做的是做出环境声明:

declare const p: (message: string) => void // or whatever
这不必在每个文件中声明。将其放入名为
typings/
的文件夹中的
d.ts
文件中,然后将该文件包括在您的tsconfig中:

"include": [
    "typings/**/*",
    ...
],

注意:您的d.ts文件无法导入任何其他模块。但它可以使用其他d.ts文件中声明的其他环境类型,而无需导入它们。如果您导入了某些内容,那么typescript将不会将您的文件视为环境声明,并且它将不起作用

从某个文件导入
p
函数的缺点是什么?为什么它必须是全局的?相关问题:因为我有一个TypeScript linter,它可以捕获所有未使用的变量,所以您不能只导入p并将其留在那里,它必须被使用或删除。另外,我不想在每个文件中都放入来自xxx的
import{p},我认为只有在使用函数时才导入它是一件好事。从长远来看,您和项目的其他维护人员将在全局函数方面遇到更多麻烦。依赖项以某种方式导入对可维护性有很大帮助。好坏取决于项目。建造摩天大楼和小屋需要不同的技术。在我的例子中,我最关心的是开发速度,并且希望能够快速原型化。所以,在我的例子中,隐式全局变量要好得多。这确实允许您管理全局变量,但这实际上不是OP想要的(尽管标题)。见芬顿的答案。是的,对不起,我回答了标题。然而,我认为这应该是管理全局变量的正确方法。我必须删除这个答案吗?=)实际上,我相信在接下来的几个月里,人们会发现它很有用,并且会因为这个问题的标题而投票支持它。我个人认为,其他人可能会附和另一种观点。如果你突然获得了大量的反对票,你就会知道该怎么办:)对不起,我没有得到。添加此行
import{p}from./logging'正是我想要避免的。我不想把它放在每个文件中。@AlexeyPetrushin你为什么要避免这个?这正是typescript想要强制执行的:使依赖项(即
imports
)尽可能明确,以便您知道自己在使用什么以及它来自何处。Globals只是把水弄脏了。我们如何避免在每个文件中都使用
声明
,而不使用导入?如果你可以声明正确的接口,
(message:any,…additionals:any[])=>void
,这是另一个答案中建议的,为什么你要将其声明为
any
,它只能在单个文件中工作。我将此作为社区wiki的答案。如果我写的东西有任何错误,请用参考资料改正。这完全是我的想法,可能不是100%准确。但这是一个正确的方向。