我通过显式设置窗口上的属性为我的对象设置全局名称空间。
window.MyNamespace = window.MyNamespace || {};
TypeScript强调MyNamespace,并抱怨:
属性“MyNamespace”在类型为“window”的值上不存在
任何“
我可以通过将MyNamespace声明为环境变量并删除窗口显式来使代码工作,但我不想这样做。
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
我如何保持窗口在那里,让TypeScript满意?
作为旁注,我发现特别有趣的是,TypeScript抱怨,因为它告诉我,窗口的类型是any,它肯定可以包含任何东西。
全局变量是“邪恶的”:)我认为拥有可移植性的最好方法是:
首先导出接口:(例如,./custom.window.ts)
export interface CustomWindow extends Window {
customAttribute: any;
}
第二,导入
import {CustomWindow} from './custom.window.ts';
第三,使用CustomWindow强制转换全局变量窗口:
declare let window: CustomWindow;
通过这种方式,你也不会在不同的IDE中有红线,如果你使用它与窗口对象的存在属性,所以在最后尝试:
window.customAttribute = 'works';
window.location.href = '/works';
用TypeScript 2.4测试。X和最新!
[2022]:我们必须在React或Nextjs项目中扩展“window”对象。
我们可以通过下面的步骤来解决这个问题。
在src文件夹名称中创建一个文件夹作为类型。
在类型文件夹中创建一个名为index.d.ts的文件
将这段代码写在index.d.ts文件中。
出口{};
声明全局{
窗口{
名称空间:任何;
}
}
窗口。名称空间=窗口。名称空间| | {};
保存该文件。
现在最后一个变化。
修改“tsConfig. conf”json文件。来继承节点模块类型和我们的类型。
{
"compilerOptions": {
...
"typeRoots": [
"./node_modules/@types",
"./src/types"
],
....
}