我有一个只包含静态方法的类,并且不需要实例化它。我希望这个类用静态值包装一个“枚举”,由这个类下的静态方法使用。以下是此用例的简化示例,因为我“想要”它看起来像:
class UserActionsService {
static actionTypes = {
foo: 1,
bar: 2,
buzz: 3
};
static doSomethingWith(actionType) {
console.log(actoinType);
}
}
,用法应该如下:
UserActionsService.doSomethingWith(UserActionsService.actionTypes.buzz);
但是,由于我无法使静态actionTypes
成员工作,我用一个静态函数包装它,如下所示:
class UserActionsService {
static actionTypes() {
return {
foo: 1,
bar: 2,
buzz: 3
};
}
static doSomethingWith(actionType) {
console.log(actoinType);
}
}
并像这样使用它:
UserActionsService.doSomethingWith(UserActionsService.actionTypes().buzz);
///////////////////////////////////////////////// Ugly part here ^^
它有效,但很难看。我错过了什么吗?是否存在仅使静态方法可用而不是静态成员的特定原因?
答案 0 :(得分:2)
您可以使用 getter 来绕过“丑陋”的语法
class UserActionsService {
static get actionTypes() {
return {
foo: 1,
bar: 2,
buzz: 3
};
}
static doSomethingWith(actionType) {
console.log(actionType);
}
}
UserActionsService.doSomethingWith(UserActionsService.actionTypes.buzz);
答案 1 :(得分:1)
如果您正在使用模块,您可以将'enum'设置为与静态函数处于同一级别的普通对象,并将它们导出为模块的属性:
const actionTypes = {
foo: 1,
bar: 2,
buzz: 3
}
function doSomethingWith(actionType){
do the thing...
}
module.exports = {actionTypes, doSomethingWith};
const UserActionsService = require('./UserActionsService');
UserActionsService.doSomethingWith(UserActionsService.actionTypes.buzz);
在这种情况下,ES6'类'确实是语法糖,并没有提供这种简单结构无法提供的任何内容。
至于为什么你不能做你最初尝试做的事情,它不是(由dsfq评论)支持的语法。