有没有办法在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
});
}
第二种形式对我来说似乎很混乱,代码提示并没有真正将它视为只读属性而是作为普通变量。
是否有任何直接在模块内定义属性的标准方法?
答案 0 :(得分:4)
不,没有办法使用任何记录的语言功能在TypeScript中声明module
上的属性。
你可以用几种略微圆润的技巧来做到这一点。
module
可以扩展现有的class
或function
。因此,我创建了一个具有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