在用 TS 进行 electron 开发时,我需要在 main 端将一些方法数据挂在在 global 对象上。比如我需要将 windows 对象挂在到 global 上,但是一写则报 TS2339 这个错误:

Property 'windows' does not exist on type 'Global'.

网上找了很多办法,比如定义全局 type 文件等等,最后的结局方法如下。

最终解决方法

// windows.ts
// import ....
declare global {
  namespace NodeJS {
    interface Global {
      windows: Electron.BrowserWindow;
// ...业务代码
global.windows = window
// ...业务代码

解决方案原理

在官方的 handbook 中,有一段解释如下:

在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级 import 或者 export 的文件都被视为模块(Modules)。相反,没有任何顶级导入或导出声明的文件被视为脚本,其内容在全局范围内可用(因此也可用于模块)。

直白的话就是,当有 import 或者 export 之后,所有的对象都是在这个模块中了,所以不能够采用 global.d.ts 的方法重新定义一个 typings 文件。所以如果需要修改 global 这个对象,必须在当前文件下 declare 出 global 对象然后在 NodeJS 的命名空间中扩展 Global 的字段。

关注前端技术的小伙伴,欢迎点击扫描下面的二维码加入我建的 「前端开发交流群」,共同交流前沿前端技术。
在这里插入图片描述

我是空谷,独立产品经理、全栈设计师、全栈工程师。
技术栈为 React/Dva/Umi/Node/Egg/Electron
欢迎扫码加我微信交流,备注来源:CSDN
kongguxs001

在用 TS 进行 electron 开发时,我需要在 main 端将一些方法数据挂在在 global 对象上。比如我需要将 windows 对象挂在到 global 上,但是一写则报 TS2339 这个错误:Property 'windows' does not exist on type 'Global'.网上找了很多办法,比如定义全局 type 文件等等,最后的结局方法如下。最终解决方...
ts某个方法(a)里面返回一个对象有属性b,在另一个方法里调用a().b,可以正常打印出结果,但是编译报错报错信息:TS2339:报错Property 'b' does not exist on type '{}',后来改写成a()[b],成功去掉报错,耶!
TS2339:“字符串”类型上不存在属性“包含” 由我怕爱的太早我们不能终老 提交于2019-12-04 22:26:19 我已经看到关于字符串数组而不是实际字符串的这个错误。我有一个带有该行的 TypeScript 文件 if (!bus.lineInfo.PublishedLineName.includes(input)) { 这给了我一个错误 TS2339: Property 'includes' does not exist on type 'string'. bus是实现bus接口的变量: 报错说某个对象上 不存在某个属性 开始以为写错了 然后翻看之前的js版本 发现 引用的模块都已同样的模块 用ts的角度说 引用的都已一个类型接口的对象 可为什么js好使 ts就报错呢 因为 ts的语法有些变化 这里笔者只说一点 用我们常见的 require举例 1.如果你在js里写 require.context()好使,那么请继续使用 2.如果...
其实Vue官方从2.6.X版本开始就部分使用Ts重写了。 我个人对更严格类型限制没有积极的看法,毕竟各类转类型的骚写法写习惯了。 然鹅最近的一个项目,是TypeScript+ Vue,毛计喇,学之...…真香! 注意此篇标题的“前”,本文旨在讲Ts混入框架的使用,不讲Class API 1. 使用官方脚手架构建 npm install -g @vue/cli yarn glob...
关于vue-cli4使用require.context报错TS2339: Property ‘context’ does not exist on type 'NodeRequire’解决方案 问题描述: vue-cli4使用require.context后出现以下报错TS2339: Property 'context' does not exist on type 'NodeRequire'.
Error: src/app/app.component.html:7:78 - error TS2339: Property ‘value’ does not exist on type ‘EventTarget’. 7 <input type=“text” [value]=“inputValue” (input)=“inputValue = $event.target.value” > ~~~~~ src/app/app.component.ts:5:16 5 templateUrl:
带有编译器错误的Typescript汇总插件。 这是对原始rollup-plugin-typescript的重写,从此开始并借用了。 这个版本比原始版本慢一些,但是它将打印出打字稿的句法和语义诊断消息(毕竟使用打字稿的主要原因)。 # with npm npm install rollup-plugin-typescript2 typescript tslib --save-dev # with yarn yarn add rollup-plugin-typescript2 typescript tslib --dev // rollup.conf
用于MSBuild的TSLint 使用TypeScript代码的MSBuild目标。 在获取它。 :warning_selector: TSLint已弃用。 有关更多详细信息,问题: 。 :warning_selector: 使用您的NuGet软件包管理器添加此软件包和 。 它应该自动添加到您的项目。 默认情况下使用TSLint的默认配置。 如果您想使用自己的tslint.json文件,则将TSLintConfig属性添加到您的项目: < TSLintConfig>Scripts/tslint.json</ TSLintConfig> 所有可覆盖的项目组和属性都在下面。 阅读以获取特定于TSLint的棉绒详细信息。 可覆盖的项目组 TSLintExclude 排除文件名的问题。 (blank) TSLintInclude 文件名要短绒。 @(TypeScriptCompile) (除非TSLintExcludeTypeScriptCompile为true ) TSLintRulesDirectory 用户创建规则的目录
在Vue 3.0,使用`defineEmits`来定义组件的emits选项,而不是在组件直接声明`emits`选项。 如果您想手动触发一个事件,可以使用`$emit`方法。例如,如果您有一个名为`myEvent`的事件,您可以在组件方法使用`this.$emit('myEvent', data)`来手动触发它。 以下是一个示例组件,展示如何在Vue 3.0使用`defineEmits`和`$emit`: ```typescript import { defineComponent } from 'vue'; export default defineComponent({ emits: ['myEvent'], methods: { handleClick() { // 在此处手动触发myEvent事件 this.$emit('myEvent', { eventData: 'example data' }); template: ` <button @click="handleClick">Click me</button> 请注意,在组件使用`this.$emit`之前,必须将事件名称添加到`emits`选项