模块中的属性

时间:2014-01-04 19:49:06

标签: properties typescript accessor

有没有办法在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; }
}

现在我被迫使用它:

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

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

是否有任何直接在模块内定义属性的标准方法?

3 个答案:

答案 0 :(得分:4)

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

你可以用几种略微​​圆润的技巧来做到这一点。

module可以扩展现有的classfunction。因此,我创建了一个具有static属性的类,然后创建了一个与module使用相同名称的class

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

module My {
    var works: boolean = true;
}

alert(My.Value);

它确实会在JavaScript生成的代码中产生一个奇怪的地方,你不会手动执行(并且应该被大多数优化器删除)...它将在创建模块时重新声明变量My。这不会导致运行时问题,因为该变量已在JavaScript中解除,并且不会与第一次使用冲突。

这是另一种选择:

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

var My = Global.My;
alert(My.Value);

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

答案 1 :(得分:1)

而不是使用module关键字,而是考虑使用export,这将允许您执行您想要执行的操作,将文件本身视为一个模块(这是CommonJS和AMD两者的方式)工作)。

// in My.ts
var My = {
  get value() {
    return 42;
  }
};

export = My;


// in foo.ts
import My = require('My');
console.log(My.value);

我在博客文章The Definitive Guide to TypeScript中更详细地描述了这一点。

答案 2 :(得分:0)

我尝试了单身人士

let My = {
  get value() {
    return 42;
  }
}

export My

但遇到了一个问题,即发出的JS仍然说get value()并且在旧版本的Node上不起作用。我尝试了Object.defineProperty,但后来失去了TypeScript兼容性。这是我修复这两种情况的桥梁:

interface My {
  value: number
}

// type assertion fixes TypeScript usage
let my = <My>{}
// defineProperty fixes JS usage
Object.defineProperty(my, 'value', {
  get: () => 42
});

export = my;

它像打字稿中的模块一样使用

import * as my from './my'

my.property // returns 42
// my.property = doesn't work