我通过显式设置窗口上的属性为我的对象设置全局名称空间。
window.MyNamespace = window.MyNamespace || {};
TypeScript强调MyNamespace,并抱怨:
属性“MyNamespace”在类型为“window”的值上不存在
任何“
我可以通过将MyNamespace声明为环境变量并删除窗口显式来使代码工作,但我不想这样做。
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
我如何保持窗口在那里,让TypeScript满意?
作为旁注,我发现特别有趣的是,TypeScript抱怨,因为它告诉我,窗口的类型是any,它肯定可以包含任何东西。
对于那些想要在窗口对象上设置计算或动态属性的人,你会发现使用declare global方法是不可能的。来阐明这个用例
window[DynamicObject.key] // Element implicitly has an 'any' type because type Window has no index signature
你可以尝试这样做
declare global {
interface Window {
[DyanmicObject.key]: string; // error RIP
}
}
但上面的操作会出错。这是因为在TypeScript中,接口不能很好地使用计算属性,并且会抛出类似于
A computed property name in an interface must directly refer to a built-in symbol
为了解决这个问题,你可以按照建议将窗口转换为<any>
(window as any)[DynamicObject.key]
供参考(这是正确答案):
在。d里面。Ts定义文件
type MyGlobalFunctionType = (name: string) => void
如果你在浏览器中工作,你可以通过重新打开window的界面将成员添加到浏览器的窗口上下文:
interface Window {
myGlobalFunction: MyGlobalFunctionType
}
Node.js也是这样:
declare module NodeJS {
interface Global {
myGlobalFunction: MyGlobalFunctionType
}
}
现在你声明根变量(它将实际存在于window或global上):
declare const myGlobalFunction: MyGlobalFunctionType;
然后在一个普通的.ts文件中,但作为副作用导入,你实际上实现了它:
global/* or window */.myGlobalFunction = function (name: string) {
console.log("Hey !", name);
};
最后在代码库的其他地方使用它,使用:
global/* or window */.myGlobalFunction("Kevin");
myGlobalFunction("Kevin");
对于那些想要在窗口对象上设置计算或动态属性的人,你会发现使用declare global方法是不可能的。来阐明这个用例
window[DynamicObject.key] // Element implicitly has an 'any' type because type Window has no index signature
你可以尝试这样做
declare global {
interface Window {
[DyanmicObject.key]: string; // error RIP
}
}
但上面的操作会出错。这是因为在TypeScript中,接口不能很好地使用计算属性,并且会抛出类似于
A computed property name in an interface must directly refer to a built-in symbol
为了解决这个问题,你可以按照建议将窗口转换为<any>
(window as any)[DynamicObject.key]