getter/setter 在 TypeScript 中的模块上

getter/setter on a module in TypeScript

我在我的 TypeScript 项目中使用 AMD 模块(编译器标志“--module amd”)。虽然我可以 easily use getters/setters on my classes 我想在我的模块上做同样的事情但是

export get abc() : string {
    return "abc";
}

returns

error TS1008: Unexpected token; 'module, class, interface, enum, import or statement' expected.

export function get abc() : string {
    return "abc";
}

returns

error TS1005: '(' expected.

我做错了什么?

您目前只能向 class 添加 getter 和 setter。

TypeScript 在 getter 和 setter 上使用的代码转换将 属性 添加到对象的原型,这对 classes 比对模块更有意义。

这是可能的,使用特殊的 export = ... 语法如下:

class MyModule {
    get abc() {
        return "abc";
    }
}

var myModule = new MyModule();
export = myModule;

这使得 class MyModule 的实例充当模块的 API。您不必将任何数据放入 class - 只需将您的函数移入其中,否则保持不变。缺点是如果函数 a 调用函数 b 它将不得不说 this.b()myModule.b() (后者更接近于正常的模块导出)。

此外,您还必须先声明一个命名变量。你不能只说:

export = new MyModule(); // This doesn't work

仅供未来访客参考...

类似于@Daniel Earwicker 所说和解释@billc.cn 所说的内容,您也可以将 class 与命名空间混为一谈,然后将 getter/setter 定义为静态方法:

export class X {
   static get abc():string {
      return "abc";
   }
}

export namespace X {
  // ... other code
}

但这意味着您将在您的库(模块)中拥有一个命名空间,除非您想要更改您处理库属性的方式,否则您将不得不进行 hack export = X; @ Daniel Earwicker 提到。

https://www.typescriptlang.org/docs/handbook/declaration-merging.html

您可以通过 class 直接导出 getter,如下所示:

// helper class to be removed when/if module-level getters are available
class _someHelper {
    static get myStaticString(): string {
        return "hi, world";
    }
}

export const myStaticString = _someHelper.myStaticString;

然后像这样导入:

import { myStaticString } from "my-module";

不是最漂亮的,但确实有用。