模块中的属性

Aci*_*dic 5 properties accessor typescript

有没有办法在TypeScript中定义属性module

这些都没有编译:

module My {
    // doesnt work
    get Value(): number { return 42; }

    // doesn't work either
    get function Value(): number { return 42; }

    // nope
    function get Value(): number { return 42; }
}
Run Code Online (Sandbox Code Playgroud)

现在我被迫使用这个:

module My {
    declare var Value: number;
    Object.defineProperty(My, "Value", {
        get: () => 42
    });
}
Run Code Online (Sandbox Code Playgroud)

第二种形式对我来说似乎很混乱,代码提示并没有真正将它视为只读属性而是作为普通变量.

有没有直接在模块内定义属性的标准方法?

Wir*_*rie 5

不,没有办法module使用任何记录的语言功能在 TypeScript 中声明属性。

你可以用几个稍微绕一点的技术来做到这一点。

Amodule可以扩展现有的classfunction。因此,我创建了一个具有static属性的类,然后创建了一个moduleclass.

class My
{
    static get Value():Number {
        return 42;
    }
}

module My {
    var works: boolean = true;
}

alert(My.Value);
Run Code Online (Sandbox Code Playgroud)

它确实会在 JavaScript 生成的代码中生成一个您不会手动执行的奇怪操作(并且无论如何都应该被大多数优化器删除)......它会在My创建模块时重新声明该变量。这不会导致运行时问题,因为该变量已经在 J​​avaScript 中被提升,并且不会与第一次使用发生冲突。

这是另一种选择:

module Global {
    class Inner {
        get Value():Number {
            return 42;
        }       
    }   
    export var My;
    My = new Inner();
}

var My = Global.My;
alert(My.Value);
Run Code Online (Sandbox Code Playgroud)

虽然它提供了一个额外的命名空间,但您可以随意操作它并使用内部类或根据需要更改它。这样,My变量是全局的,就像module.