如何在TypeScript中的“window”上显式设置新属性?
我通过在如何在TypeScript中的“window”上显式设置新属性?,typescript,Typescript,我通过在窗口上显式设置属性来设置对象的全局名称空间 window.MyNamespace = window.MyNamespace || {}; TypeScript在MyNamespace下面加下划线,并抱怨: 类型为“window”的值上不存在属性“MyNamespace” 任何“ 我可以通过将MyNamespace声明为环境变量并删除窗口的明确性使代码正常工作,但我不想这样做 declare var MyNamespace: any; MyNamespace = MyNamespace
窗口
上显式设置属性来设置对象的全局名称空间
window.MyNamespace = window.MyNamespace || {};
TypeScript在MyNamespace
下面加下划线,并抱怨:
类型为“window”的值上不存在属性“MyNamespace”
任何“
我可以通过将MyNamespace
声明为环境变量并删除窗口
的明确性使代码正常工作,但我不想这样做
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
我如何保持窗口
在其中并使TypeScript愉快
作为旁注,我觉得TypeScript抱怨特别有趣,因为它告诉我
window
是any
类型,它肯定可以包含任何内容。刚刚在中找到了这个问题的答案
基本上,您需要扩展现有的
窗口
界面来告诉它您的新属性。从TYPESCRIPT^3.4.3开始,此解决方案不再有效
或者
您只需键入:
window['MyNamespace']
您不会得到编译错误,它的工作原理与键入
窗口相同。MyNamespace
接受的答案是我以前使用的答案,但TypeScript 0.9.*它不再工作。窗口
接口的新定义似乎完全取代了内置定义,而不是对其进行扩展
我已经开始这样做了:
interface MyWindow extends Window {
myFunction(): void;
}
declare var window: MyWindow;
更新:使用TypeScript 0.9.5,可接受的答案再次生效。要保持动态,只需使用:
(window as any).MyNamespace
interface Window {
someValue: string
another: boolean
}
使用苗条或TSX?其他答案对我都不起作用 以下是我所做的:
(window as any).MyNamespace
如果需要使用需要使用
import
的自定义类型扩展窗口
对象,可以使用以下方法:
window.d.ts
import MyInterface from './MyInterface';
declare global {
interface Window {
propName: MyInterface
}
}
请参阅手册“声明合并”部分中的“全局增强”:如果您正在使用,请参阅下面的操作方法 创建
打字/custom/window.d.ts
:
interface Window {
MyNamespace: any;
}
declare var window: Window;
interface Window {
MyNamespace: any;
}
安装自定义键入:
typings install file:typings/custom/window.d.ts --save --global
完成,使用它! Typescript不会再抱怨了:
window.MyNamespace = window.MyNamespace || {};
在找到答案后,我认为这一页可能会有所帮助。 不确定声明合并的历史,但它解释了为什么下面的方法可以工作
declare global {
interface Window { MyNamespace: any; }
}
window.MyNamespace = window.MyNamespace || {};
对于那些使用Angular CLI的用户来说,这很简单: src/polyfills.ts
declare global {
interface Window {
myCustomFn: () => void;
}
}
my-custom-utils.ts
window.myCustomFn = function () {
...
};
如果您使用的是IntelliJ,则在拾取新的多边形填充之前,还需要在IDE中更改以下设置:
> File
> Settings
> Languages & Frameworks
> TypeScript
> check 'Use TypeScript Service'.
供参考(这是正确答案):
在.d.ts
定义文件中
type MyGlobalFunctionType = (name: string) => void
如果在浏览器中工作,
通过重新打开窗口的界面,可以将成员添加到浏览器的窗口上下文:
interface Window {
myGlobalFunction: MyGlobalFunctionType
}
NodeJS也有同样的想法:
declare module NodeJS {
interface Global {
myGlobalFunction: MyGlobalFunctionType
}
}
现在声明根变量(它将实际存在于window或global上)
然后在一个常规的.ts
文件中,但作为副作用导入,您实际上实现了它:
global/* or window */.myGlobalFunction = function (name: string) {
console.log("Hey !", name);
};
最后,在代码库中的其他地方使用它,方法如下:
global/* or window */.myGlobalFunction("Kevin");
myGlobalFunction("Kevin");
其他大多数答案都不完美
- 其中一些只是为了显示而抑制类型推断
- 其他一些只关心全局变量作为名称空间,而不是作为接口/类
// typings.d.ts
declare interface Window {
myNamespace?: MyNamespace & typeof MyNamespace
}
declare interface MyNamespace {
somemethod?()
}
declare namespace MyNamespace {
// ...
}
上面的代码将namespaceMyNamespace
和interfaceMyNamespace
的类型合并到全局变量MyNamespace
(窗口的属性)中。global是“邪恶的”:),我认为实现可移植性的最好方法是:
首先导出接口:(例如:./custom.window.ts)
第二次导入
import {CustomWindow} from './custom.window.ts';
第三次使用CustomWindow强制转换全局var窗口
declare let window: CustomWindow;
这样,如果与window对象的现有属性一起使用,则在不同的IDE中也不会出现红线,因此在结束时请尝试:
window.customAttribute = 'works';
window.location.href = '/works';
使用Typescript 2.4.x和最新版本进行测试!我不需要经常这样做,我遇到的唯一情况是在中间件上使用Redux Devtools 我只是做了:
const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
或者你可以:
让myWindow=windowas any;
然后
myWindow.myProp='my value';
我今天想在Angular(6)库中使用它,我花了一段时间才让它按预期工作
为了让我的库使用声明,我必须对声明全局对象新属性的文件使用d.ts
扩展名
因此,最终,该文件以如下内容结束:
/path to angular workspace/angular workspace/projects/angular library/src/globals.d.ts
创建完成后,不要忘记在public_api.ts
中公开它
对我来说就是这样。希望这能有所帮助。制作自定义界面扩展窗口,并将自定义属性添加为可选属性 然后,让使用自定义接口的customWindow与原始窗口一起赋值 它与typescript@3.1.3.
interface ICustomWindow extends Window {
MyNamespace?: any
}
const customWindow:ICustomWindow = window;
customWindow.MyNamespace = customWindow.MyNamespace {}
如果您使用的是Typescript 3.x,您可以在其他答案中省略
声明全局
部分,而只使用:
(window as any).MyNamespace
interface Window {
someValue: string
another: boolean
}
这在我使用Typescript 3.3、WebPack和TSLint时起到了作用。对于那些想要在
窗口
对象上设置计算或动态属性的人,你会发现使用声明全局
方法是不可能的
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中,接口不能很好地处理计算属性,并且会抛出
declare global {
interface Window {
[DyanmicObject.key]: string; // error RIP
}
}
A computed property name in an interface must directly refer to a built-in symbol
(window as any)[DynamicObject.key]
declare var window: any;
window.MyNamespace
window.MyNamespace = MyObject
window["newProperty"] = customObj;
interface Window {
myLib: any
}
interface Window {
MyNamespace: any;
}
window["MyNamespace"] = window["MyNamespace"] || {};
interface MyNamespacedWindow extends Window {
MyNamespace: object;
}
declare var window: MyNamespacedWindow;
// in a global file:
var abc = 100;
// Refers to 'abc' from above.
globalThis.abc = 200;