getter/setter 在 TypeScript 中的模块上
getter/setter on a module in TypeScript
我在我的 TypeScript 项目中使用 AMD 模块(编译器标志“--module amd”)。虽然我可以 easily use getters/setters on my classes 我想在我的模块上做同样的事情但是
export get abc() : string {
return "abc";
}
returns
error TS1008: Unexpected token; 'module, class, interface, enum,
import or statement' expected.
和
export function get abc() : string {
return "abc";
}
returns
error TS1005: '(' expected.
我做错了什么?
您目前只能向 class 添加 getter 和 setter。
TypeScript 在 getter 和 setter 上使用的代码转换将 属性 添加到对象的原型,这对 classes 比对模块更有意义。
这是可能的,使用特殊的 export = ...
语法如下:
class MyModule {
get abc() {
return "abc";
}
}
var myModule = new MyModule();
export = myModule;
这使得 class MyModule
的实例充当模块的 API。您不必将任何数据放入 class - 只需将您的函数移入其中,否则保持不变。缺点是如果函数 a
调用函数 b
它将不得不说 this.b()
或 myModule.b()
(后者更接近于正常的模块导出)。
此外,您还必须先声明一个命名变量。你不能只说:
export = new MyModule(); // This doesn't work
仅供未来访客参考...
类似于@Daniel Earwicker 所说和解释@billc.cn 所说的内容,您也可以将 class 与命名空间混为一谈,然后将 getter/setter 定义为静态方法:
export class X {
static get abc():string {
return "abc";
}
}
export namespace X {
// ... other code
}
但这意味着您将在您的库(模块)中拥有一个命名空间,除非您想要更改您处理库属性的方式,否则您将不得不进行 hack export = X;
@ Daniel Earwicker 提到。
https://www.typescriptlang.org/docs/handbook/declaration-merging.html
您可以通过 class 直接导出 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";
不是最漂亮的,但确实有用。
我在我的 TypeScript 项目中使用 AMD 模块(编译器标志“--module amd”)。虽然我可以 easily use getters/setters on my classes 我想在我的模块上做同样的事情但是
export get abc() : string {
return "abc";
}
returns
error TS1008: Unexpected token; 'module, class, interface, enum, import or statement' expected.
和
export function get abc() : string {
return "abc";
}
returns
error TS1005: '(' expected.
我做错了什么?
您目前只能向 class 添加 getter 和 setter。
TypeScript 在 getter 和 setter 上使用的代码转换将 属性 添加到对象的原型,这对 classes 比对模块更有意义。
这是可能的,使用特殊的 export = ...
语法如下:
class MyModule {
get abc() {
return "abc";
}
}
var myModule = new MyModule();
export = myModule;
这使得 class MyModule
的实例充当模块的 API。您不必将任何数据放入 class - 只需将您的函数移入其中,否则保持不变。缺点是如果函数 a
调用函数 b
它将不得不说 this.b()
或 myModule.b()
(后者更接近于正常的模块导出)。
此外,您还必须先声明一个命名变量。你不能只说:
export = new MyModule(); // This doesn't work
仅供未来访客参考...
类似于@Daniel Earwicker 所说和解释@billc.cn 所说的内容,您也可以将 class 与命名空间混为一谈,然后将 getter/setter 定义为静态方法:
export class X {
static get abc():string {
return "abc";
}
}
export namespace X {
// ... other code
}
但这意味着您将在您的库(模块)中拥有一个命名空间,除非您想要更改您处理库属性的方式,否则您将不得不进行 hack export = X;
@ Daniel Earwicker 提到。
https://www.typescriptlang.org/docs/handbook/declaration-merging.html
您可以通过 class 直接导出 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";
不是最漂亮的,但确实有用。