如何在TypeScript中的`window`中显式设置一个新的属性?
我通过在window
上显式设置属性来为我的对象设置全局命名空间。
window.MyNamespace = window.MyNamespace || {};
TypeScript强调MyNamespace
并抱怨说:
属性'MyNamespace'不存在于'window'types的值上任何“
我可以通过将MyNamespace
声明为环境variables并删除window
显式来使代码工作,但我不想这样做。
declare var MyNamespace: any; MyNamespace = MyNamespace || {};
我怎样才能保持window
,使TypeScript快乐?
作为一个方面的说明,我觉得特别有趣的是TypeScript抱怨,因为它告诉我, window
是any
types的,肯定可以包含任何东西。
要保持dynamic,只需使用:
(<any>window).MyNamespace
刚刚在另一个StackOverflow问题的答案中find了答案 。
declare global { interface Window { MyNamespace: any; } } window.MyNamespace = window.MyNamespace || {};
基本上你需要扩展现有的window
界面来告诉它你的新属性。
要么…
你可以input:
window['MyNamespace']
你不会得到一个编译错误,它和inputwindow.MyNamespace
使用TSX? 没有其他答案为我工作。
以下是我所做的:
(window as any).MyNamespace
接受的答案是我曾经使用的,但与TypeScript 0.9。*它不再起作用。 Window
界面的新定义似乎完全取代了内置的定义,而不是增强它。
我已经采取了这样做:
interface MyWindow extends Window { myFunction(): void; } declare var window: MyWindow;
更新:与TypeScript 0.9.5接受的答案是再次工作。
如果需要使用需要使用import
的自定义types来扩展window
对象,则可以使用以下方法:
window.d.ts
import MyInterface from './MyInterface'; declare global { interface Window { propName: MyInterface } }
请参阅手册“声明合并”一节中的“全局扩充”: https : //www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation
如果您使用的是TypeScript定义pipe理器,请按照以下步骤操作 !
npm install typings --global
创buildtypestypings/custom/window.d.ts
:
interface Window { MyNamespace: any; } declare var window: Window;
安装您的自定义input:
typings install file:typings/custom/window.d.ts --save --global
完成,使用它! 打字稿不会再抱怨了:
window.MyNamespace = window.MyNamespace || {};
全球是“邪恶”:),我认为最好的方式也有便携性是:
-
首先导出界面:(例如:./custom.window.ts)
export interface CustomWindow extends Window { customAttribute: any; }
-
第二你import
import {CustomWindow} from './custom.window.ts';
-
第三个用CustomWindow投射全局variables窗口
declare let window: CustomWindow;
这样,如果你使用窗口对象的已有属性,那么在不同的IDE中也不会有红线,所以最后试试:
window.customAttribute = 'works'; window.location.href = '/works';
使用Typescript 2.4.x进行testing
如果您使用的是Angular CLI,那么它非常简单(在CLI RC.0上testing):
SRC / polyfills.ts
declare global { interface Window { myCustomFn: () => void; } }
我定制,utils.ts
window.myCustomFn = function () { ... };
我正在使用IntelliJ,所以我还需要在IDE中更改以下设置,然后再拾取新的polyfills:
> File > Settings > Languages & Frameworks > TypeScript > check 'Use TypeScript Service'.
大多数其他答案并不完美。
- 他们中的一些只是压制店铺的types推断。
- 其他一些只关心全局variables作为命名空间,而不是作为接口/类
今天早上我也遇到类似的问题。 我在SO上试了这么多的“解决scheme”,但是没有一个绝对没有产生types错误,并且在IDE(webstorm或者vscode)中启用触发types跳转。
最后,从这里
https://github.com/Microsoft/TypeScript/issues/3180#issuecomment-102523512
,我find一个合理的解决scheme来附加types作为接口/类和命名空间的全局variables的types 。
示例如下:
// typings.d.ts declare interface Window { myNamespace?: MyNamespace & typeof MyNamespace } declare interface MyNamespace { somemethod?() } declare namespace MyNamespace { // ... }
现在,上面的代码将名称空间MyNamespace
和接口MyNamespace
合并到全局variablesmyNamespace
(window属性)中。
当我尝试这个, window
被键入到Window
– 这意味着有一个定义,指出一个Window
可以支持的属性和方法,而您的自定义名称空间不在该列表中。
你不能使用TypeScript模块得到你想要的行为吗?
module MyNamespace { export class Example { } }
供参考(这是正确的答案):
在.d.ts
定义文件中
type MyGlobalFunctionType = (name: string) => void
如果您在浏览器中工作,则可以通过重新打开Window的界面将成员添加到浏览器的窗口上下文中:
interface Window { myGlobalFunction: MyGlobalFunctionType }
NodeJS的想法相同:
declare module NodeJS { interface Global { myGlobalFunction: MyGlobalFunctionType } }
现在你声明了根variables(这实际上将生活在窗口或全局)
declare const myGlobalFunction: MyGlobalFunctionType;
然后在一个常规的.ts
文件中,但是作为副作用导入,你实际上实现了它:
global/* or window */.myGlobalFunction = function (name: string) { console.log("Hey !", name); };
最后在代码库的其他地方使用它:
global/* or window */.myGlobalFunction("Kevin"); myGlobalFunction("Kevin");
find答案后,我认为这个页面可能会有所帮助。 https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation不知道声明合并的历史,但它解释了为什么以下可以工作。;
interface Window { MyNamespace: any; }
- tsconfig.json:生成:在configuration文件中找不到任何input
- 用于导入commonjs / amd模块的新的es6语法,例如`import foo = require('foo')`
- TypeScript编译为一个单独的JS文件
- 如何用Jasmine为私有方法编写Angular 2 / TypeScript的unit testing
- rxjs / Subject.d.ts错误:Class'Subject <T>'错误地扩展了基类'Observable <T>'
- angular度2sorting和筛选
- Angular 2 beta.17:Property'map'在types'Observable <Response>'上不存在
- npm @types org包中的TypeScripttypes
- 当在jquerycallback中调用TypeScript“this”范围问题