【问题标题】:getter/setter on a module in TypeScriptTypeScript 模块上的 getter/setter
【发布时间】:2015-05-04 06:51:00
【问题描述】:

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

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

返回

错误 TS1008:意外的令牌; '模块,类,接口,枚举, 需要导入或声明。

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

返回

错误 TS1005: '(' 预期。

我做错了什么?

【问题讨论】:

标签: typescript webstorm typescript1.4


【解决方案1】:

目前您只能将 getter 和 setter 添加到类中。

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

【讨论】:

  • 模块本身不也是对象吗?我认为 getter/setter 可以在任何对象上使用。
  • @daniel.sedlacek 不在对象具有未定义原型时
  • @daniel.sedlacek 类 getter/setter 可用于类的实例,而不是类对象(即函数)本身。您可能可以在类上使用静态 getter/setter,然后将定义与模块合并。模块的类型将是函数。
  • JavaScript 透视模块中的 @daniel.sedlacek 只是对象。从TypeScript 角度来看,模块类似于C# 中的namespaceDelphi 中的unit——代表结构而不是行为的事物
【解决方案2】:

这是可能的,使用特殊的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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我很确定这不会像您认为的那样做,并且可能导致意外错误。它可能适用于像这样的静态 getter(我认为这可能只是一个属性),但是一旦您动态获取任何数据,它就会在导出时获取(在模块解析期间),因此您的 getter 有效地发生一次模块解析,然后总是返回该初始值,而不是预期的动态值。有效 - 这意味着您的导出不再是吸气剂。
    • 当然,实际上没有人应该这样做。我正在回答所问的问题。正确的解决方案是只导出一个返回值的函数而不是使用 getter。
    【解决方案4】:

    仅供未来访客参考...

    与@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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多