Typescript:将窗口上的属性更改为可选?

Leo*_*ang 6 javascript typescript

默认的 TS 类型window.NotificationNotification,但由于 Web 通知 API 只有 90% 的浏览器支持,因此应该是Notification | undefined。我最近遇到一个错误,我在使用时window.Notification没有检查它是否已定义。

有没有办法覆盖 的属性window,例如使它们可选?我尝试了这个,但没有成功:

declare global {
  interface Window {
    Notification?: Notification;
  }
}
Run Code Online (Sandbox Code Playgroud)

Les*_*iak 2

您无法更改属性的定义,但您可以:

  • 创建一个具有更改属性的新类型
  • 将窗口类型更改为新定义的类型。

看:

import {Expect, Equal} from "type-testing";

declare global {
  type WindowModified = Window & Omit<typeof globalThis, 'Notification'> & {
   Notification?: Notification
  }
}
declare let window: WindowModified;
type CHECK = Expect<Equal<typeof window.Notification, Notification | undefined>>
Run Code Online (Sandbox Code Playgroud)

TS游乐场

  • 事实证明,它甚至比这更容易 - `global.d.ts`: `declare let notification: typeof window.Notification | undefined;`我看着上面的内容并想“关键是重新声明`window`全局...嘿,等等,`Notfication`是一个全局...”。 (2认同)