TypeScript中模块的getter/setter

9

我正在使用AMD模块(编译器标志“--module amd”)在我的TypeScript项目中。虽然我可以轻松地在我的类上使用getter/setter,但我希望在我的模块上也能做到同样的事情,但是……

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

返回

错误 TS1008:意外的标记;需要“模块、类、接口、枚举、导入或语句”。

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

返回值

错误 TS1005: 需要 '('。

我做错了什么?


1
可能是模块中的属性的重复内容。 - Acidic
4个回答

7

目前你只能向类中添加getter和setter。

TypeScript对getter和setter使用的代码转换会将属性添加到对象的原型中,这对于类而言比模块更有意义。


1
模块本质上也是对象吗?我认为任何对象都可以使用getter/setter。 - daniel.sedlacek
@daniel.sedlacek 当对象具有未定义的原型时不行。 - David Sherret
@daniel.sedlacek 类的getter/setter方法可用于类的实例,而不是类对象(即函数)本身。您可以在类上使用静态getter/setter方法,然后将其定义与模块合并。但是,该模块的类型将为函数。 - billc.cn
1
JavaScript 的角度来看,模块只是对象。从 TypeScript 的角度来看,模块类似于 C# 中的 namespaceDelphi 中的 unit - 代表结构而非行为的东西。 - xmojmr

6
这是可能的,使用特殊的export = ...语法,如下所示:
class MyModule {
    get abc() {
        return "abc";
    }
}

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

这将使类MyModule的一个实例充当模块的API。您不必在类中放置任何数据 - 只需将函数移动到其中并且除此之外保持它们不变。缺点是,如果函数a调用函数b,则它必须说this.b()myModule.b()(后者更接近于普通模块导出)。
另外,您必须先声明一个命名变量。不能只说:
export = new MyModule(); // This doesn't work

0

仅供将来访问者参考...

类似于@Daniel Earwicker所说和@billc.cn所解释的,您还可以将类与命名空间合并,然后将getter / setter定义为静态方法:

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

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

但这意味着您将在库(模块)中拥有一个命名空间,除非您想更改库属性的寻址方式,否则您必须执行@Daniel Earwicker提到的hack export = X;

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


-1
您可以通过类直接导出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";

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


4
我非常确定这个操作不会按照你的想法执行并且可能导致意外错误。对于像这样的静态getter,它可能能够正常工作(而我认为它只需要是一个属性),但是一旦你动态获取任何数据,它会在导入时(模块解析期间)被获取,因此你的getter实际上只在模块解析期间执行一次,然后总是返回那个初始值,而不是预期的动态值。实际上,这意味着你的导出不再是一个getter。 - iceblueorbitz
当然,实际上没有人应该这样做。不过我是按照问题所问来回答的。正确的解决方案是导出一个返回值的函数而不是使用getter。 - Josh M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接