我通过显式设置属性来为我的对象设置全局命名空间window.
window.MyNamespace = window.MyNamespace || {};
Run Code Online (Sandbox Code Playgroud)
TypeScript强调MyNamespace并抱怨:
属性'MyNamespace'在'window'类型的值上不存在任何"
我可以通过声明MyNamespace为环境变量并删除window显式来使代码工作,但我不想这样做.
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
Run Code Online (Sandbox Code Playgroud)
我怎样才能window留在那里让TypeScript开心?
作为旁注,我发现TypeScript抱怨特别有趣,因为它告诉我这种window类型any绝对可以包含任何东西.
在JavaScript中,我可以这样做:
something = 'testing';
Run Code Online (Sandbox Code Playgroud)
然后在另一个文件中:
if (something === 'testing')
Run Code Online (Sandbox Code Playgroud)
它将something被定义(只要它们以正确的顺序被调用).
我似乎无法弄清楚如何在TypeScript中做到这一点.
这就是我尝试过的.
在.d.ts文件中:
interface Window { something: string; }
Run Code Online (Sandbox Code Playgroud)
然后在我的main.ts文件中:
window.something = 'testing';
Run Code Online (Sandbox Code Playgroud)
然后在另一个文件中:
if (window.something === 'testing')
Run Code Online (Sandbox Code Playgroud)
这很有效.但我希望能够失去window.它的一部分,让我的something全球化.有没有办法在TypeScript中做到这一点?
(如果有人感兴趣,我真的想为我的应用程序设置日志记录.我希望能够log.Debug从任何文件调用而无需导入和创建对象.)
让我们以以下代码为例:
const constVar = 'some string';
let letVar = 'some string';
var varVar = 'some string';
(function() {
console.log(window.constVar); // prints undefined
console.log(window.letVar); // prints undefined
console.log(window.varVar); // prints 'some string'
})();Run Code Online (Sandbox Code Playgroud)
根据constmdn声明的描述:
该声明创建一个常量,其范围可以在声明它的块的全局范围内或局部范围内。
我let以同样的方式假设作品。
在这种情况下,“块”包含在全局范围内。我想这里的重要区别是,尽管const constVar“全局”可访问,但仍未在window对象上定义它。
这使我认为全局范围和window对象是完全不同的。最终导致2个问题。
为什么使用var关键字声明的变量定义在上,window而用const而声明的变量let却未定义在window?
“全局范围”和window浏览器提供给我们的对象之间有什么区别?
我正在使用Moment.js处理TypeScript项目中的日期时间对象。我想定义一个对象类型,该对象类型的键的类型值为Moment。
但是,当我将以下内容添加到全局定义文件(test.d.ts)时,在项目中的任何位置都找不到该文件中的接口。
import { Moment } from 'moment';
interface Test {
date: Moment;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在.ts或.tsx文件中使用接口时,出现此TypeScript错误:
[at-loader] ./src/<examplefilename>.tsx:91:26
TS2304: Cannot find name 'Test'.
Run Code Online (Sandbox Code Playgroud)
VSCode的TypeScript错误检查和TSLint均未显示该代码的任何问题。
如何从外部模块导入类型以在全局定义文件中使用?