Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在TypeScript中的“window”上显式设置新属性?_Typescript - Fatal编程技术网

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

其他大多数答案都不完美

  • 其中一些只是为了显示而抑制类型推断
  • 其他一些只关心全局变量作为名称空间,而不是作为接口/类
今天早上我也遇到了类似的问题。我在StackOverflow上尝试了很多“解决方案”,但没有一个产生了绝对没有类型错误并在IDE(webstorm或vscode)中启用了触发类型跳转

最后,从这里开始

我找到了一个合理的解决方案,为同时充当接口/类和命名空间的全局变量附加类型

示例如下:

// typings.d.ts
declare interface Window {
    myNamespace?: MyNamespace & typeof MyNamespace
}

declare interface MyNamespace {
    somemethod?()
}

declare namespace MyNamespace {
    // ...
}
上面的代码将namespace
MyNamespace
和interface
MyNamespace
的类型合并到全局变量
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;