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

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

TypeScript强调MyNamespace,并抱怨:

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

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

declare var MyNamespace: any;

MyNamespace = MyNamespace || {};

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

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


当前回答

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

其他回答

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

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

要保持动态,只需使用:

(<any>window).MyNamespace

注意,这可能不适用于TSX,因为编译器可能认为<any>是TSX元素。查看与TSX兼容的类型断言的答案。

我不需要经常这样做。我唯一遇到的情况是在中间件中使用Redux DevTools。

我只是做了:

const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

或者你可以这样做:

let myWindow = window as any;

然后是myWindow。myProp = '我的值';

// In typings.d.ts(is Global)
export declare global {
    interface Window {
        __PUBLIC__: string;
    }
}

首先,您需要在当前 范围。因为TypeScript想知道对象的类型 对象。由于窗口对象是在其他地方定义的,所以不能重新定义它。

但你可以按以下方式申报:

declare var window: any;

这将不会重新定义窗口对象,也不会创建另一个名为window的变量。这意味着窗口是在其他地方定义的,您只是在当前作用域中引用它。

然后你可以通过以下方式引用你的MyNamespace对象:

window.MyNamespace

或者你可以在窗口对象上简单地设置新属性:

window.MyNamespace = MyObject

现在TypeScript不会抱怨了。