-
Notifications
You must be signed in to change notification settings - Fork 0
/
typescript.js
575 lines (574 loc) · 18.1 KB
/
typescript.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
module.exports = {
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
rules: {
'react/sort-comp': 'off',
/**
* 重载的函数必须写在一起
* @reason 增加可读性
*/
'@typescript-eslint/adjacent-overload-signatures': 'error',
/**
* 限制数组类型必须使用 Array<T> 或 T[]
* @reason 允许灵活运用两者
*/
'@typescript-eslint/array-type': 'off',
/**
* 禁止对没有 then 方法的对象使用 await
*/
'@typescript-eslint/await-thenable': 'off',
/**
* 禁止使用 // @ts-ignore // @ts-nocheck // @ts-check
* @reason 这种注释本身就是对特殊代码的说明
*/
'@typescript-eslint/ban-ts-comment': 'off',
/**
* 禁止使用类似 tslint:disable-next-line 这样的注释
*/
'@typescript-eslint/ban-tslint-comment': 'off',
/**
* 禁止使用指定的类型
*/
'@typescript-eslint/ban-types': 'off',
/**
* 类的只读属性若是一个字面量,则必须使用只读属性而不是 getter
*/
'@typescript-eslint/class-literal-property-style': ['error', 'fields'],
/**
* 使用 Map 或 Set 时,必须在构造函数上用泛型定义类型
*/
'@typescript-eslint/consistent-generic-constructors': 'off',
/**
* 必须使用内置的 Record<K, T> 来描述仅包含可索引成员的接口
*/
'@typescript-eslint/consistent-indexed-object-style': 'off',
/**
* 类型断言必须使用 as Type,禁止使用 <Type>,禁止对对象字面量进行类型断言(断言成 any 是允许的)
* @reason <Type> 容易被理解为 jsx
*/
'@typescript-eslint/consistent-type-assertions': [
'error',
{
assertionStyle: 'as',
objectLiteralTypeAssertions: 'never',
},
],
/**
* 优先使用 interface 而不是 type
* @reason interface 可以 implement, extend 和 merge
*/
'@typescript-eslint/consistent-type-definitions': ['error', 'interface'],
/**
* 一致的类型导出语法
*/
'@typescript-eslint/consistent-type-exports': 'off',
/**
* 必须使用 import type 导入类型
*/
'@typescript-eslint/consistent-type-imports': 'off',
/**
* 有默认值或可选的参数必须放到最后
*/
'default-param-last': 'off',
'@typescript-eslint/default-param-last': 'off',
/**
* 禁止使用 foo['bar'],必须写成 foo.bar
* @reason 当需要写一系列属性的时候,可以更统一
*/
'dot-notation': 'off',
'@typescript-eslint/dot-notation': 'off',
/**
* 函数返回值必须与声明的类型一致
* @reason 返回值类型可以推导出来
*/
'@typescript-eslint/explicit-function-return-type': 'off',
/**
* 必须设置类的成员的可访问性
* @reason 将不需要公开的成员设为私有的,可以增强代码的可理解性,对文档输出也很友好
*/
'@typescript-eslint/explicit-member-accessibility': 'error',
/**
* 导出的函数或类中的 public 方法必须定义输入输出参数的类型
*/
'@typescript-eslint/explicit-module-boundary-types': 'off',
/**
* 变量必须在定义的时候赋值
*/
'init-declarations': 'off',
'@typescript-eslint/init-declarations': 'off',
/**
* 类的成员之间是否需要空行
* @reason 有时为了紧凑需要挨在一起,有时为了可读性需要空一行
*/
'lines-between-class-members': 'off',
'@typescript-eslint/lines-between-class-members': 'off',
/**
* 指定类成员的排序规则
* @reason 优先级:
* 1. static > instance
* 2. field > constructor > method
* 3. public > protected > private
*/
'@typescript-eslint/member-ordering': [
'error',
{
default: [
'public-static-field',
'protected-static-field',
'private-static-field',
'static-field',
'public-static-method',
'protected-static-method',
'private-static-method',
'static-method',
'public-instance-field',
'protected-instance-field',
'private-instance-field',
'public-field',
'protected-field',
'private-field',
'instance-field',
'field',
'constructor',
'public-instance-method',
'protected-instance-method',
'private-instance-method',
'public-method',
'protected-method',
'private-method',
'instance-method',
'method',
],
},
],
/**
* 接口中的方法必须用属性的方式定义
* @reason 配置了 strictFunctionTypes 之后,用属性的方式定义方法可以获得更严格的检查
*/
'@typescript-eslint/method-signature-style': 'error',
/**
* 限制各种变量或类型的命名规则
*/
'@typescript-eslint/naming-convention': 'off',
/**
* 禁止使用 Array 构造函数
*/
'no-array-constructor': 'off',
'@typescript-eslint/no-array-constructor': 'off',
/**
* 禁止滥用 toString 方法
*/
'@typescript-eslint/no-base-to-string': 'off',
/**
* 禁止使用容易混淆的非空断言
*/
'@typescript-eslint/no-confusing-non-null-assertion': 'off',
/**
* 禁止使用返回值为 void 的函数的返回值
*/
'@typescript-eslint/no-confusing-void-expression': 'off',
/**
* 禁止重复定义类的成员
* @reason 编译阶段就会报错了
*/
'no-dupe-class-members': 'off',
'@typescript-eslint/no-dupe-class-members': 'off',
/**
* 禁止枚举类型存在两个相同的值
*/
'@typescript-eslint/no-duplicate-enum-values': 'error',
/**
* 禁止 delete 时传入的 key 是动态的
*/
'@typescript-eslint/no-dynamic-delete': 'off',
/**
* 不允许有空函数
* @reason 有时需要将一个空函数设置为某个项的默认值
*/
'no-empty-function': 'off',
'@typescript-eslint/no-empty-function': 'off',
/**
* 禁止定义空的接口
*/
'@typescript-eslint/no-empty-interface': 'error',
/**
* 禁止使用 any
*/
'@typescript-eslint/no-explicit-any': 'off',
/**
* 禁止多余的 non-null 断言
*/
'@typescript-eslint/no-extra-non-null-assertion': 'off',
/**
* 禁止定义没必要的类,比如只有静态方法的类
*/
'@typescript-eslint/no-extraneous-class': 'off',
/**
* 禁止调用 Promise 时没有处理异常情况
*/
'@typescript-eslint/no-floating-promises': 'off',
/**
* 禁止对 array 使用 for in 循环
*/
'@typescript-eslint/no-for-in-array': 'off',
/**
* 禁止使用 eval
*/
'no-implied-eval': 'off',
'@typescript-eslint/no-implied-eval': 'off',
/**
* 禁止给一个初始化时直接赋值为 number, string 的变量显式的声明类型
* @reason 可以简化代码
*/
'@typescript-eslint/no-inferrable-types': 'error',
/**
* 禁止在类之外的地方使用 this
* @reason 只允许在 class 中使用 this
*/
'no-invalid-this': 'off',
'@typescript-eslint/no-invalid-this': 'error',
/**
* 禁止使用无意义的 void 类型
* @reason void 只能用在函数的返回值中
*/
'@typescript-eslint/no-invalid-void-type': 'error',
/**
* 禁止在循环内的函数内部出现循环体条件语句中定义的变量
* @reason 使用 let 就已经解决了这个问题了
*/
'no-loop-func': 'off',
'@typescript-eslint/no-loop-func': 'off',
/**
* 禁止使用超出 js 精度范围的数字
*/
'no-loss-of-precision': 'off',
'@typescript-eslint/no-loss-of-precision': 'error',
/**
* 禁止使用 magic numbers
*/
'no-magic-numbers': 'off',
'@typescript-eslint/no-magic-numbers': 'off',
/**
* 禁止 void 抛出空
*/
'@typescript-eslint/no-meaningless-void-operator': 'off',
/**
* 禁止在接口中定义 constructor,或在类中定义 new
*/
'@typescript-eslint/no-misused-new': 'off',
/**
* 避免错误的使用 Promise
*/
'@typescript-eslint/no-misused-promises': 'off',
/**
* 禁止使用 namespace 来定义命名空间
* @reason 使用 es6 引入模块,才是更标准的方式。
* 但是允许使用 declare namespace ... {} 来定义外部命名空间
*/
'@typescript-eslint/no-namespace': [
'error',
{
allowDeclarations: true,
allowDefinitionFiles: true,
},
],
/**
* 禁止非空断言后面跟着双问号
*/
'@typescript-eslint/no-non-null-asserted-nullish-coalescing': 'error',
/**
* 禁止在 optional chaining 之后使用 non-null 断言(感叹号)
* @reason optional chaining 后面的属性一定是非空的
*/
'@typescript-eslint/no-non-null-asserted-optional-chain': 'error',
/**
* 禁止使用 non-null 断言(感叹号)
* @reason 使用 non-null 断言时就已经清楚了风险
*/
'@typescript-eslint/no-non-null-assertion': 'off',
/**
* 禁止重复定义变量
* @reason 禁用 var 之后,编译阶段就会报错了
*/
'no-redeclare': 'off',
'@typescript-eslint/no-redeclare': 'off',
/**
* 禁止无用的联合类型或交叉类型
*/
'@typescript-eslint/no-redundant-type-constituents': 'off',
/**
* 禁止使用 require
* @reason 统一使用 import 来引入模块,特殊情况使用单行注释允许 require 引入
*/
'@typescript-eslint/no-require-imports': 'error',
/**
* 禁止导入指定的模块
*/
'no-restricted-imports': 'off',
'@typescript-eslint/no-restricted-imports': 'off',
/**
* 禁止变量名与上层作用域内的已定义的变量重复
* @reason 很多时候函数的形参和传参是同名的
*/
'no-shadow': 'off',
'@typescript-eslint/no-shadow': 'off',
/**
* 禁止将 this 赋值给其他变量,除非是解构赋值
*/
'@typescript-eslint/no-this-alias': [
'error',
{
allowDestructuring: true,
},
],
/**
* 禁止 throw 字面量,必须 throw 一个 Error 对象
*/
'no-throw-literal': 'off',
'@typescript-eslint/no-throw-literal': 'off',
/**
* 禁止使用类型别名
*/
'@typescript-eslint/no-type-alias': 'off',
/**
* 测试表达式中的布尔类型禁止与 true 或 false 直接比较
*/
'@typescript-eslint/no-unnecessary-boolean-literal-compare': 'off',
/**
* 条件表达式禁止是永远为真(或永远为假)的
*/
'@typescript-eslint/no-unnecessary-condition': 'off',
/**
* 在命名空间中,可以直接使用内部变量,不需要添加命名空间前缀
*/
'@typescript-eslint/no-unnecessary-qualifier': 'off',
/**
* 禁止范型的类型有默认值时,将范型设置为该默认值
*/
'@typescript-eslint/no-unnecessary-type-arguments': 'off',
/**
* 禁止无用的类型断言
*/
'@typescript-eslint/no-unnecessary-type-assertion': 'off',
/**
* 禁止没用的类型限制
*/
'@typescript-eslint/no-unnecessary-type-constraint': 'error',
/**
* 禁止将 any 类型的变量作为函数参数调用
*/
'@typescript-eslint/no-unsafe-argument': 'off',
/**
* 禁止将变量或属性的类型设置为 any
*/
'@typescript-eslint/no-unsafe-assignment': 'off',
/**
* 禁止调用 any 类型的变量上的方法
*/
'@typescript-eslint/no-unsafe-call': 'off',
/**
* 禁止 class 和 interface 合并类型
*/
'@typescript-eslint/no-unsafe-declaration-merging': 'off',
/**
* 禁止获取 any 类型的变量中的属性
*/
'@typescript-eslint/no-unsafe-member-access': 'off',
/**
* 禁止函数的返回值的类型是 any
*/
'@typescript-eslint/no-unsafe-return': 'off',
/**
* 禁止无用的表达式
*/
'no-unused-expressions': 'off',
'@typescript-eslint/no-unused-expressions': [
'error',
{
allowShortCircuit: true,
allowTernary: true,
allowTaggedTemplates: true,
},
],
/**
* 已定义的变量必须使用
*/
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': 'off',
/**
* 禁止在定义变量之前就使用它
* @reason 编译阶段检查就足够了
*/
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': 'off',
/**
* 禁止出现没必要的 constructor
*/
'no-useless-constructor': 'off',
'@typescript-eslint/no-useless-constructor': 'error',
/**
* 禁止导出空对象
*/
'@typescript-eslint/no-useless-empty-export': 'off',
/**
* 禁止使用 require 来引入模块
* @reason no-require-imports 规则已经约束了 require
*/
'@typescript-eslint/no-var-requires': 'off',
/**
* 必须使用 ! 而不是 as
*/
'@typescript-eslint/non-nullable-type-assertion-style': 'off',
/**
* 限制语句之间的空行规则,比如变量定义完之后必须要空行
*/
'padding-line-between-statements': 'off',
'@typescript-eslint/padding-line-between-statements': 'off',
/**
* 类的构造函数参数作为类属性时,必须加上可访问性修饰符
*/
'@typescript-eslint/parameter-properties': 'off',
/**
* 使用 as const 替代 as 'bar'
* @reason as const 是新语法,不是很常见
*/
'@typescript-eslint/prefer-as-const': 'off',
/**
* 枚举值必须初始化
*/
'@typescript-eslint/prefer-enum-initializers': 'off',
/**
* 使用 for 循环遍历数组时,如果索引仅用于获取成员,则必须使用 for of 循环替代 for 循环
* @reason for of 循环更加易读
*/
'@typescript-eslint/prefer-for-of': 'error',
/**
* 使用函数类型别名替代包含函数调用声明的接口
*/
'@typescript-eslint/prefer-function-type': 'error',
/**
* 使用 includes 而不是 indexOf
*/
'@typescript-eslint/prefer-includes': 'off',
/**
* 枚举类型的值必须是字面量,禁止是计算值
* @reason 编译阶段检查就足够了
*/
'@typescript-eslint/prefer-literal-enum-member': 'off',
/**
* 禁止使用 module 来定义命名空间
* @reason module 已成为 js 的关键字
*/
'@typescript-eslint/prefer-namespace-keyword': 'error',
/**
* 使用 ?? 替代 ||
*/
'@typescript-eslint/prefer-nullish-coalescing': 'off',
/**
* 使用 optional chaining 替代 &&
*/
'@typescript-eslint/prefer-optional-chain': 'error',
/**
* 私有变量如果没有在构造函数外被赋值,则必须设为 readonly
*/
'@typescript-eslint/prefer-readonly': 'off',
/**
* 函数的参数必须设置为 readonly
*/
'@typescript-eslint/prefer-readonly-parameter-types': 'off',
/**
* 使用 reduce 方法时,必须传入范型,而不是对第二个参数使用 as
*/
'@typescript-eslint/prefer-reduce-type-parameter': 'off',
/**
* 使用 RegExp#exec 而不是 String#match
*/
'@typescript-eslint/prefer-regexp-exec': 'off',
/**
* 类的方法返回值是 this 时,类型必须设置为 this
*/
'@typescript-eslint/prefer-return-this-type': 'off',
/**
* 使用 String#startsWith 而不是其他方式
*/
'@typescript-eslint/prefer-string-starts-ends-with': 'off',
/**
* 当需要忽略下一行的 ts 错误时,必须使用 @ts-expect-error 而不是 @ts-ignore
* @reason 使用 @ts-expect-error 可以避免对不会报错的代码设置了 @ts-ignore
*/
'@typescript-eslint/prefer-ts-expect-error': 'off',
/**
* async 函数的返回值必须是 Promise
*/
'@typescript-eslint/promise-function-async': 'off',
/**
* 使用 sort 时必须传入比较函数
*/
'@typescript-eslint/require-array-sort-compare': 'off',
/**
* async 函数中必须存在 await 语句
*/
'require-await': 'off',
'@typescript-eslint/require-await': 'off',
/**
* 使用加号时,两者必须同为数字或同为字符串
*/
'@typescript-eslint/restrict-plus-operands': 'off',
/**
* 模版字符串中的变量类型必须是字符串
*/
'@typescript-eslint/restrict-template-expressions': 'off',
/**
* 禁止在 return 语句里使用 await
*/
'no-return-await': 'off',
'@typescript-eslint/return-await': 'off',
/**
* 联合类型和交叉类型必须排序
*/
'@typescript-eslint/sort-type-constituents': 'off',
/**
* 条件判断必须传入布尔值
*/
'@typescript-eslint/strict-boolean-expressions': 'off',
/**
* 使用联合类型作为 switch 的对象时,必须包含每一个类型的 case
*/
'@typescript-eslint/switch-exhaustiveness-check': 'off',
/**
* 禁止使用三斜杠导入文件
* @reason 三斜杠是已废弃的语法,但在类型声明文件中还是可以使用的
*/
'@typescript-eslint/triple-slash-reference': [
'error',
{
path: 'never',
types: 'always',
lib: 'always',
},
],
/**
* interface 和 type 定义时必须声明成员的类型
*/
'@typescript-eslint/typedef': [
'error',
{
arrayDestructuring: false,
arrowParameter: false,
memberVariableDeclaration: false,
objectDestructuring: false,
parameter: false,
propertyDeclaration: true,
variableDeclaration: false,
},
],
/**
* 方法调用时需要绑定到正确的 this 上
*/
'@typescript-eslint/unbound-method': 'off',
/**
* 函数重载时,若能通过联合类型将两个函数的类型声明合为一个,则使用联合类型而不是两个函数声明
*/
'@typescript-eslint/unified-signatures': 'error',
},
};