问题已经解决。打算推荐给队友使用。
楼主保持原来的观点,对于js语言:
[1] 需要 2 组数据结构结合起来用,或者
[2] 实现一组数据仓库类似于数据库,可以选择退化为单纯用标识符表示数值。
楼主是偏向于方案 [2] 的,所以想问下有没有人已实现的。毕竟 [1] 的玩法太多,相关代码比较分散,不够“一把梭”。
typescript的enum不是这么用的,至于其局限性,楼主已经在下面回复了。
@otakustay 大佬发的链接是其他语言下的,启发我的思路是其他语言的enum的实现更加完整一点,可能已经有人用js模拟实现,所以在github上找"enum"话题的库,找到了。
我不知道国外的这批大佬出于什么需求,扩大的我的见识,如果有人能解释一下就更好了,写的这个js库恰好满足我的“基本需求”:https://github.com/adrai/enum
// 不单独出现数字,即magic number:
const myEnum = new Enum({ displayer:3, keyboard: 1, mouse:2 })
// 提供一个按声明时的key顺序的遍历的iterable(返回的是array,保证次序)
myEnum.enums.forEach(() => {})
// 按"标识符"查,只不过得到的是EnumItem类型,要取一下value属性:
myEnum['键盘'].value // 1
myEnum.get('键盘').value // 1
// 按数字反查,只不过得到的是EnumItem类型,要取一下key属性:(这里数字是模拟出来的,理性情况不要单独出现)
myEnum.get(1).key // '键盘'
这个库的缺点:计算和内存开销比较大,因为不是做成定制化的,所以数据全都创建好了。但是好像也没有更好性能的写法了。
1
PainAndLove 2020-08-06 11:52:57 +08:00
ts enum 应该就可以满足了
|
2
revalue OP ts enum, 说实话我看过。它是 key: value 的。而我这个需求至少需要 [1, keyboard, '键盘'],在这里 keyboard 是没有信息量的,就是为了替代 1 来显示给程序员看的,另为了满足 js key value 语法。怎么从 1 查询到 '键盘'?这里用到 1 又出现 magic number 了。
所以,至少需要 enum 再加 1 个数据结构来配合。 而且我看了 ts enum 的实现,是基于 js object 的。js object 不保证 key 的遍历顺序按照声明时的顺序的吧。 @PainAndLove |
3
revalue OP 如果“不直接使用数值 123”,这是不可能的。目标还是不让数值单独出现。
比如从 1 查询到 '键盘',获取 map[1],1 还是单独出现了,这样算是还有 magic number,是不合理的。 |
4
loading 2020-08-06 12:23:31 +08:00 via Android
一个很普遍的关系数据库的某个表
id,name,magic number,order number 看不懂的话,你们的大型 web 能有多大。 |
5
Mohanson 2020-08-06 12:27:36 +08:00 1
对 magic number 你是不是有什么误解.
|
7
lix7 2020-08-06 12:51:25 +08:00
magic number...这词儿不容易歧义吧
|
8
otakustay 2020-08-06 12:52:56 +08:00
1. 数字( 1 )与标识符( keyboard )对应 - 这是 enum
2. 需要能获取到中文名称 - 这是 enum 的 localization https://stackoverflow.com/questions/17380900/enum-localization 3. 需要能遍历 - 这是反射 https://stackoverflow.com/questions/105372/how-to-enumerate-an-enum 其实它还是一个 enum,用 js 去实现这些功能就行 |
9
revalue OP |
10
revalue OP |
11
revalue OP 感谢感谢,不妨从 enum 作为切入点,不需要作为“数据库”搞太多高大上的功能。
在 github 上搜一下 enum 主题的。 楼主挖一个坑,之后楼主来点评一下这个库 https://github.com/adrai/enum |
12
momocraft 2020-08-06 14:12:54 +08:00
数据定义成一个 ` { } [] ` ,查找的地方 Array#find 也可以,变换成一个 Map 也可以
比发明个库实现你这些乱七八糟的功能容易很多 |
13
KuroNekoFan 2020-08-06 14:14:04 +08:00
enum 不会给出静态错误,如果希望更 robust 的限制,可以用 union type
|
14
DDounx 2020-08-06 14:17:03 +08:00
如果不多的话两个哈希表也挺方便的吧(
|
15
sivacohan 2020-08-06 17:03:28 +08:00 via iPhone
为啥我觉得你这个需求是 enum+i18n
|
17
wingoo 2020-08-06 17:27:56 +08:00
配置中心??
|