如何创建真实 class 的定义?

How can I create definition of of real class?

如果我有 class:

在文件 "BigClass.ts" 中:

class BigClass{
  /// a lot of properties and methods here, I mean, a lot
}
window['big'] = new BigClass();

我想在 "Big.d.ts" 中声明一个全局的:

declare let big:BigClass;

TS 不允许我这样做,因为我也只能使用 .d 文件中的接口来定义声明的变量。

但是这个 class 非常大,我不想为它创建一个接口,我将在其中重复每个 prop 和方法...有没有办法绕过它?

或者也许有另一种声明全局变量的方法,基于我不知道的现有 class?

And I would like to declare global one in "Big.d.ts":

为什么要这样做? 如果你将声明这个 class 的任何实例,ts 将已经知道关于这个 class 的一切。 并且还要避免全局变量。 const big = new BigClass();

执行此操作的方法是简单地将 declare let big:BigClass; 放入 BigClass.ts,而不是放在 d.ts 文件中。这是完全合法的。

这是假设 BigClass.ts 不是模块,这意味着它没有 import\export 语句。如果它不是模块,其他文件也会 "see" 声明语句。

然而,这是一个不好的做法,因为您依赖于 window 恰好是浏览器中的全局对象这一事实。

更好的方法:

//file: BigClass.ts

class BigClass{
}

interface Window {
  big: BigClass;
}
window.big = new BigClass();

而且由于模块确实更易于使用,因此使用模块的方法如下:

//file: BigClass.ts

export class BigClass{
}
declare global {
  interface Window {
    big: BigClass;
  }
}
window.big = new BigClass();