@lsby/eslint-config 0.3.11 → 0.3.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -123,18 +123,27 @@ var ts\u5B89\u5168\u6027 = {
123
123
  "no-undefined": "error",
124
124
  // ==================== 反虚假安全 ====================
125
125
  // 永远使用let, 拒绝var和const, 并自动修复
126
- // 原因:
127
- // 1 抽象泄漏
128
- // const只约束原语值和指针不变, 不约束引用值本身不变
126
+ //
127
+ // # 原因:
128
+ // ## 抽象泄漏
129
+ // 使用const时, 通常我们**实际**想表达的意图是"该值不可变", 但const没有完全兑现这个意图
130
+ // 设计上, const只约束原语值和指针不变, 不约束引用值本身不变
129
131
  // 使用者要搞懂什么可变什么不可变, 必须理解原语值和引用值的区别, 以及变量在内存上的机制
130
132
  // 这种"必须搞懂背后的原理才能正常使用"的情况是显然的抽象泄漏
131
- // 2 误导
133
+ // ## 误导
132
134
  // 对于新人, 很容易被误解, 导致引用值被意外修改
133
- // 3 心智成本
135
+ // ## 心智成本
134
136
  // 实际使用时, 即使是const声明值, 也必须确认其是否为引用类型, 若是则还是需要确认所有可能的修改
135
137
  // 这与let无异, 反而增加了心智成本
136
- // **错误的信息比没有信息更糟糕**
137
- // 替代:
138
+ // ## 滑坡
139
+ // **错误的信息比没有信息更糟糕, 不完全的限制比没有限制更糟糕**
140
+ // 没有信息时人会自己去查, 而错误的信息会带来误导
141
+ // 没有限制时人会考虑边界, 不完全的限制则导致要么完全不考虑边界(因为认为有兜底), 要么更小心的考虑边界(区分哪些是兜底, 哪些是没有兜底的)
142
+ // 这不是加强培训能解决的, 人是不可信任和漏洞百出的, 必须通过形式约束才能让我们建立对代码的信心
143
+ // 让我们想想墨菲定律: 任何可能出错的事情最终一定会出错
144
+ // 如果我们放任使用这种很容易被误解的特性, 在大型项目中, 在足够长的时间后, 一定会出现我们不想看到的那种写法
145
+ //
146
+ // # 替代:
138
147
  // 如果真的需要表达不变, 应该使用类型等级的递归只读, 建模隐藏等方法
139
148
  // 这虽然复杂度更高, 但可以真正保证安全
140
149
  // 这也迫使程序员思考是否真的有必要这样设计, 而不是"随手一用", 提供一个"虚假的安全感"
@@ -145,14 +154,12 @@ var ts\u5B89\u5168\u6027 = {
145
154
  // 但当状态在未来被扩展时, 扩展的状态依然会被包含在else分支里, 导致状态遗漏却无任何报错
146
155
  // 此时, 应该考虑使用提前返回或switch穷尽所有可能, 而不是提供一个默默吃掉所有新状态的兜底逻辑
147
156
  // 这几条规则包括:
148
- // - 修剪可以提前返回的else
149
- // - 在if是等于或不等于的情况下不允许else
150
157
  // - switch的case必须穷尽
151
158
  // - 不允许switch的default分支
152
- "no-else-return": "error",
153
- "@lsby/no-else-on-equality": "error",
159
+ // - 对字面量枚举的if-else判断应该用switch穷尽
154
160
  "@typescript-eslint/switch-exhaustiveness-check": "error",
155
- "@lsby/no-switch-default": "error"
161
+ "@lsby/no-switch-default": "error",
162
+ "@lsby/prefer-switch-for-literal-enum": "error"
156
163
  }
157
164
  };
158
165
  var jsDoc\u5B89\u5168\u6027 = {
package/dist/esm/index.js CHANGED
@@ -83,18 +83,27 @@ var ts\u5B89\u5168\u6027 = {
83
83
  "no-undefined": "error",
84
84
  // ==================== 反虚假安全 ====================
85
85
  // 永远使用let, 拒绝var和const, 并自动修复
86
- // 原因:
87
- // 1 抽象泄漏
88
- // const只约束原语值和指针不变, 不约束引用值本身不变
86
+ //
87
+ // # 原因:
88
+ // ## 抽象泄漏
89
+ // 使用const时, 通常我们**实际**想表达的意图是"该值不可变", 但const没有完全兑现这个意图
90
+ // 设计上, const只约束原语值和指针不变, 不约束引用值本身不变
89
91
  // 使用者要搞懂什么可变什么不可变, 必须理解原语值和引用值的区别, 以及变量在内存上的机制
90
92
  // 这种"必须搞懂背后的原理才能正常使用"的情况是显然的抽象泄漏
91
- // 2 误导
93
+ // ## 误导
92
94
  // 对于新人, 很容易被误解, 导致引用值被意外修改
93
- // 3 心智成本
95
+ // ## 心智成本
94
96
  // 实际使用时, 即使是const声明值, 也必须确认其是否为引用类型, 若是则还是需要确认所有可能的修改
95
97
  // 这与let无异, 反而增加了心智成本
96
- // **错误的信息比没有信息更糟糕**
97
- // 替代:
98
+ // ## 滑坡
99
+ // **错误的信息比没有信息更糟糕, 不完全的限制比没有限制更糟糕**
100
+ // 没有信息时人会自己去查, 而错误的信息会带来误导
101
+ // 没有限制时人会考虑边界, 不完全的限制则导致要么完全不考虑边界(因为认为有兜底), 要么更小心的考虑边界(区分哪些是兜底, 哪些是没有兜底的)
102
+ // 这不是加强培训能解决的, 人是不可信任和漏洞百出的, 必须通过形式约束才能让我们建立对代码的信心
103
+ // 让我们想想墨菲定律: 任何可能出错的事情最终一定会出错
104
+ // 如果我们放任使用这种很容易被误解的特性, 在大型项目中, 在足够长的时间后, 一定会出现我们不想看到的那种写法
105
+ //
106
+ // # 替代:
98
107
  // 如果真的需要表达不变, 应该使用类型等级的递归只读, 建模隐藏等方法
99
108
  // 这虽然复杂度更高, 但可以真正保证安全
100
109
  // 这也迫使程序员思考是否真的有必要这样设计, 而不是"随手一用", 提供一个"虚假的安全感"
@@ -105,14 +114,12 @@ var ts\u5B89\u5168\u6027 = {
105
114
  // 但当状态在未来被扩展时, 扩展的状态依然会被包含在else分支里, 导致状态遗漏却无任何报错
106
115
  // 此时, 应该考虑使用提前返回或switch穷尽所有可能, 而不是提供一个默默吃掉所有新状态的兜底逻辑
107
116
  // 这几条规则包括:
108
- // - 修剪可以提前返回的else
109
- // - 在if是等于或不等于的情况下不允许else
110
117
  // - switch的case必须穷尽
111
118
  // - 不允许switch的default分支
112
- "no-else-return": "error",
113
- "@lsby/no-else-on-equality": "error",
119
+ // - 对字面量枚举的if-else判断应该用switch穷尽
114
120
  "@typescript-eslint/switch-exhaustiveness-check": "error",
115
- "@lsby/no-switch-default": "error"
121
+ "@lsby/no-switch-default": "error",
122
+ "@lsby/prefer-switch-for-literal-enum": "error"
116
123
  }
117
124
  };
118
125
  var jsDoc\u5B89\u5168\u6027 = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lsby/eslint-config",
3
- "version": "0.3.11",
3
+ "version": "0.3.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "require": "./dist/cjs/index.cjs",
@@ -30,7 +30,7 @@
30
30
  "tsup": "^8.3.0"
31
31
  },
32
32
  "peerDependencies": {
33
- "@lsby/eslint-plugin": "^0.0.26",
33
+ "@lsby/eslint-plugin": "^0.0.28",
34
34
  "@types/eslint": "^9.6.1",
35
35
  "eslint": "^8.57.0",
36
36
  "eslint-config-prettier": "^9.1.0",