我通过显式设置窗口上的属性为我的对象设置全局名称空间。

window.MyNamespace = window.MyNamespace || {};

TypeScript强调MyNamespace,并抱怨:

属性“MyNamespace”在类型为“window”的值上不存在 任何“

我可以通过将MyNamespace声明为环境变量并删除窗口显式来使代码工作,但我不想这样做。

declare var MyNamespace: any;

MyNamespace = MyNamespace || {};

我如何保持窗口在那里,让TypeScript满意?

作为旁注,我发现特别有趣的是,TypeScript抱怨,因为它告诉我,窗口的类型是any,它肯定可以包含任何东西。


当前回答

我使用无声明。 我的例子如下:

其他回答

在四处寻找答案后,我认为这个页面可能会有所帮助:

全球增长

我不确定声明合并的历史,但它解释了为什么下面可以工作。

declare global {
    interface Window { MyNamespace: any; }
}

window.MyNamespace = window.MyNamespace || {};

供参考(这是正确答案):

在。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");

创建一个扩展Window的自定义界面,并将自定义属性添加为可选属性。

然后,让customWindow使用自定义接口,但值与原始窗口相同。

它与TypeScript 3.1.3一起工作。

interface ICustomWindow extends Window {
  MyNamespace?: any
}

const customWindow:ICustomWindow = window;

customWindow.MyNamespace = customWindow.MyNamespace {}

创建一个名为global.d的文件。Ts,例如/src/@types/global.d。Ts,然后定义如下接口:

interface Window {
  myLib: any
}

参考:Global .d.ts

TypeScript不会对字符串属性执行类型检查。

window["newProperty"] = customObj;

理想情况下,应该避免使用全局变量场景。我有时使用它在浏览器控制台中调试一个对象。