@flint.fyi/ts 0.14.3 → 0.14.4

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.
Files changed (101) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/lib/createTypeScriptFileFromProgram.js +1 -0
  3. package/lib/language.d.ts +1 -0
  4. package/lib/plugin.d.ts +44 -0
  5. package/lib/plugin.js +22 -0
  6. package/lib/rules/anyReturns.d.ts +6 -0
  7. package/lib/rules/anyReturns.js +187 -0
  8. package/lib/rules/anyReturns.test.d.ts +1 -0
  9. package/lib/rules/anyReturns.test.js +647 -0
  10. package/lib/rules/caseDuplicates.d.ts +6 -0
  11. package/lib/rules/caseDuplicates.js +49 -0
  12. package/lib/rules/caseDuplicates.test.d.ts +1 -0
  13. package/lib/rules/caseDuplicates.test.js +307 -0
  14. package/lib/rules/elseIfDuplicates.d.ts +6 -0
  15. package/lib/rules/elseIfDuplicates.js +53 -0
  16. package/lib/rules/elseIfDuplicates.test.d.ts +1 -0
  17. package/lib/rules/elseIfDuplicates.test.js +176 -0
  18. package/lib/rules/forDirections.d.ts +6 -0
  19. package/lib/rules/forDirections.js +124 -0
  20. package/lib/rules/forDirections.test.d.ts +1 -0
  21. package/lib/rules/forDirections.test.js +99 -0
  22. package/lib/rules/functionNewCalls.d.ts +6 -0
  23. package/lib/rules/functionNewCalls.js +60 -0
  24. package/lib/rules/functionNewCalls.test.d.ts +1 -0
  25. package/lib/rules/functionNewCalls.test.js +115 -0
  26. package/lib/rules/negativeZeroComparisons.js +4 -22
  27. package/lib/rules/nonOctalDecimalEscapes.d.ts +6 -0
  28. package/lib/rules/nonOctalDecimalEscapes.js +57 -0
  29. package/lib/rules/nonOctalDecimalEscapes.test.d.ts +1 -0
  30. package/lib/rules/nonOctalDecimalEscapes.test.js +69 -0
  31. package/lib/rules/numericLiteralParsing.d.ts +6 -0
  32. package/lib/rules/numericLiteralParsing.js +97 -0
  33. package/lib/rules/numericLiteralParsing.test.d.ts +1 -0
  34. package/lib/rules/numericLiteralParsing.test.js +99 -0
  35. package/lib/rules/selfAssignments.d.ts +6 -0
  36. package/lib/rules/selfAssignments.js +44 -0
  37. package/lib/rules/selfAssignments.test.d.ts +1 -0
  38. package/lib/rules/selfAssignments.test.js +66 -0
  39. package/lib/rules/selfComparisons.d.ts +6 -0
  40. package/lib/rules/selfComparisons.js +41 -0
  41. package/lib/rules/selfComparisons.test.d.ts +1 -0
  42. package/lib/rules/selfComparisons.test.js +297 -0
  43. package/lib/rules/sequences.d.ts +6 -0
  44. package/lib/rules/sequences.js +34 -0
  45. package/lib/rules/sequences.test.d.ts +1 -0
  46. package/lib/rules/sequences.test.js +48 -0
  47. package/lib/rules/typeofComparisons.d.ts +6 -0
  48. package/lib/rules/typeofComparisons.js +78 -0
  49. package/lib/rules/typeofComparisons.test.d.ts +1 -0
  50. package/lib/rules/typeofComparisons.test.js +85 -0
  51. package/lib/rules/utils/discriminateAnyType.d.ts +12 -0
  52. package/lib/rules/utils/discriminateAnyType.js +41 -0
  53. package/lib/rules/utils/getThisExpression.d.ts +2 -0
  54. package/lib/rules/utils/getThisExpression.js +23 -0
  55. package/lib/rules/utils/isUnsafeAssignment.d.ts +13 -0
  56. package/lib/rules/utils/isUnsafeAssignment.js +76 -0
  57. package/lib/rules/utils/operators.d.ts +4 -0
  58. package/lib/rules/utils/operators.js +36 -0
  59. package/lib/utils/declarationIncludesGlobal.d.ts +2 -0
  60. package/lib/utils/declarationIncludesGlobal.js +5 -0
  61. package/lib/utils/declarationsIncludeGlobal.js +2 -5
  62. package/lib/utils/hasSameTokens.d.ts +2 -0
  63. package/lib/utils/hasSameTokens.js +30 -0
  64. package/lib/utils/isGlobalDeclarationOfName.d.ts +5 -0
  65. package/lib/utils/isGlobalDeclarationOfName.js +31 -0
  66. package/package.json +1 -1
  67. package/src/createTypeScriptFileFromProgram.ts +1 -0
  68. package/src/language.ts +1 -0
  69. package/src/plugin.ts +22 -0
  70. package/src/rules/anyReturns.test.ts +649 -0
  71. package/src/rules/anyReturns.ts +263 -0
  72. package/src/rules/caseDuplicates.test.ts +308 -0
  73. package/src/rules/caseDuplicates.ts +57 -0
  74. package/src/rules/elseIfDuplicates.test.ts +177 -0
  75. package/src/rules/elseIfDuplicates.ts +69 -0
  76. package/src/rules/forDirections.test.ts +100 -0
  77. package/src/rules/forDirections.ts +163 -0
  78. package/src/rules/functionNewCalls.test.ts +116 -0
  79. package/src/rules/functionNewCalls.ts +75 -0
  80. package/src/rules/negativeZeroComparisons.ts +8 -27
  81. package/src/rules/nonOctalDecimalEscapes.test.ts +70 -0
  82. package/src/rules/nonOctalDecimalEscapes.ts +70 -0
  83. package/src/rules/numericLiteralParsing.test.ts +100 -0
  84. package/src/rules/numericLiteralParsing.ts +116 -0
  85. package/src/rules/selfAssignments.test.ts +67 -0
  86. package/src/rules/selfAssignments.ts +50 -0
  87. package/src/rules/selfComparisons.test.ts +298 -0
  88. package/src/rules/selfComparisons.ts +45 -0
  89. package/src/rules/sequences.test.ts +49 -0
  90. package/src/rules/sequences.ts +37 -0
  91. package/src/rules/typeofComparisons.test.ts +86 -0
  92. package/src/rules/typeofComparisons.ts +88 -0
  93. package/src/rules/utils/discriminateAnyType.ts +66 -0
  94. package/src/rules/utils/getThisExpression.ts +24 -0
  95. package/src/rules/utils/isUnsafeAssignment.ts +113 -0
  96. package/src/rules/utils/operators.ts +39 -0
  97. package/src/utils/declarationIncludesGlobal.ts +9 -0
  98. package/src/utils/declarationsIncludeGlobal.ts +3 -7
  99. package/src/utils/hasSameTokens.ts +45 -0
  100. package/src/utils/isGlobalDeclarationOfName.ts +51 -0
  101. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,649 @@
1
+ import rule from "./anyReturns.js";
2
+ import { ruleTester } from "./ruleTester.js";
3
+
4
+ ruleTester.describe(rule, {
5
+ invalid: [
6
+ {
7
+ code: `
8
+ function foo() {
9
+ return 1 as any;
10
+ }
11
+ `,
12
+ snapshot: `
13
+ function foo() {
14
+ return 1 as any;
15
+ ~~~~~~~~~~~~~~~~
16
+ Unsafe return of a value of type \`any\`.
17
+ }
18
+ `,
19
+ },
20
+ {
21
+ code: `
22
+ function foo() {
23
+ return Object.create(null);
24
+ }
25
+ `,
26
+ snapshot: `
27
+ function foo() {
28
+ return Object.create(null);
29
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
30
+ Unsafe return of a value of type \`any\`.
31
+ }
32
+ `,
33
+ },
34
+ {
35
+ code: `
36
+ const foo = () => {
37
+ return 1 as any;
38
+ };
39
+ `,
40
+ snapshot: `
41
+ const foo = () => {
42
+ return 1 as any;
43
+ ~~~~~~~~~~~~~~~~
44
+ Unsafe return of a value of type \`any\`.
45
+ };
46
+ `,
47
+ },
48
+ {
49
+ code: `
50
+ const foo = () => Object.create(null);'
51
+ `,
52
+ snapshot: `
53
+ const foo = () => Object.create(null);'
54
+ ~~~~~~~~~~~~~~~~~~~
55
+ Unsafe return of a value of type \`any\`.
56
+ `,
57
+ },
58
+ {
59
+ code: `
60
+ function foo() {
61
+ return [] as any[];
62
+ }
63
+ `,
64
+ snapshot: `
65
+ function foo() {
66
+ return [] as any[];
67
+ ~~~~~~~~~~~~~~~~~~~
68
+ Unsafe return of a value of type \`any[]\`.
69
+ }
70
+ `,
71
+ },
72
+ {
73
+ code: `
74
+ function foo() {
75
+ return [] as Array<any>;
76
+ }
77
+ `,
78
+ snapshot: `
79
+ function foo() {
80
+ return [] as Array<any>;
81
+ ~~~~~~~~~~~~~~~~~~~~~~~~
82
+ Unsafe return of a value of type \`any[]\`.
83
+ }
84
+ `,
85
+ },
86
+ {
87
+ code: `
88
+ function foo() {
89
+ return [] as readonly any[];
90
+ }
91
+ `,
92
+ snapshot: `
93
+ function foo() {
94
+ return [] as readonly any[];
95
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
96
+ Unsafe return of a value of type \`any[]\`.
97
+ }
98
+ `,
99
+ },
100
+ {
101
+ code: `
102
+ function foo() {
103
+ return [] as Readonly<any[]>;
104
+ }
105
+ `,
106
+ snapshot: `
107
+ function foo() {
108
+ return [] as Readonly<any[]>;
109
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
110
+ Unsafe return of a value of type \`any[]\`.
111
+ }
112
+ `,
113
+ },
114
+ {
115
+ code: `
116
+ const foo = () => {
117
+ return [] as any[];
118
+ };
119
+ `,
120
+ snapshot: `
121
+ const foo = () => {
122
+ return [] as any[];
123
+ ~~~~~~~~~~~~~~~~~~~
124
+ Unsafe return of a value of type \`any[]\`.
125
+ };
126
+ `,
127
+ },
128
+ {
129
+ code: `
130
+ const foo = () => [] as any[];
131
+ `,
132
+ snapshot: `
133
+ const foo = () => [] as any[];
134
+ ~~~~~~~~~~~
135
+ Unsafe return of a value of type \`any[]\`.
136
+ `,
137
+ },
138
+ {
139
+ code: `
140
+ function foo(): Set<string> {
141
+ return new Set<any>();
142
+ }
143
+ `,
144
+ snapshot: `
145
+ function foo(): Set<string> {
146
+ return new Set<any>();
147
+ ~~~~~~~~~~~~~~~~~~~~~~
148
+ Unsafe return of type \`Set<any>\` from function with return type \`Set<string>\`.
149
+ }
150
+ `,
151
+ },
152
+ {
153
+ code: `
154
+ function foo(): Map<string, string> {
155
+ return new Map<string, any>();
156
+ }
157
+ `,
158
+ snapshot: `
159
+ function foo(): Map<string, string> {
160
+ return new Map<string, any>();
161
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
162
+ Unsafe return of type \`Map<string, any>\` from function with return type \`Map<string, string>\`.
163
+ }
164
+ `,
165
+ },
166
+ {
167
+ code: `
168
+ function foo(): Set<string[]> {
169
+ return new Set<any[]>();
170
+ }
171
+ `,
172
+ snapshot: `
173
+ function foo(): Set<string[]> {
174
+ return new Set<any[]>();
175
+ ~~~~~~~~~~~~~~~~~~~~~~~~
176
+ Unsafe return of type \`Set<any[]>\` from function with return type \`Set<string[]>\`.
177
+ }
178
+ `,
179
+ },
180
+ {
181
+ code: `
182
+ function foo(): Set<Set<Set<string>>> {
183
+ return new Set<Set<Set<any>>>();
184
+ }
185
+ `,
186
+ snapshot: `
187
+ function foo(): Set<Set<Set<string>>> {
188
+ return new Set<Set<Set<any>>>();
189
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
190
+ Unsafe return of type \`Set<Set<Set<any>>>\` from function with return type \`Set<Set<Set<string>>>\`.
191
+ }
192
+ `,
193
+ },
194
+
195
+ {
196
+ code: `
197
+ type Fn = () => Set<string>;
198
+ const foo1: Fn = () => new Set<any>();
199
+ const foo2: Fn = function test() {
200
+ return new Set<any>();
201
+ };
202
+ `,
203
+ snapshot: `
204
+ type Fn = () => Set<string>;
205
+ const foo1: Fn = () => new Set<any>();
206
+ ~~~~~~~~~~~~~~
207
+ Unsafe return of type \`Set<any>\` from function with return type \`Set<string>\`.
208
+ const foo2: Fn = function test() {
209
+ return new Set<any>();
210
+ ~~~~~~~~~~~~~~~~~~~~~~
211
+ Unsafe return of type \`Set<any>\` from function with return type \`Set<string>\`.
212
+ };
213
+ `,
214
+ },
215
+ {
216
+ code: `
217
+ type Fn = () => Set<string>;
218
+ function receiver(arg: Fn) {}
219
+ receiver(() => new Set<any>());
220
+ receiver(function test() {
221
+ return new Set<any>();
222
+ });
223
+ `,
224
+ snapshot: `
225
+ type Fn = () => Set<string>;
226
+ function receiver(arg: Fn) {}
227
+ receiver(() => new Set<any>());
228
+ ~~~~~~~~~~~~~~
229
+ Unsafe return of type \`Set<any>\` from function with return type \`Set<string>\`.
230
+ receiver(function test() {
231
+ return new Set<any>();
232
+ ~~~~~~~~~~~~~~~~~~~~~~
233
+ Unsafe return of type \`Set<any>\` from function with return type \`Set<string>\`.
234
+ });
235
+ `,
236
+ },
237
+ {
238
+ code: `
239
+ function foo() {
240
+ return this;
241
+ }
242
+
243
+ function bar() {
244
+ return () => this;
245
+ }
246
+ `,
247
+ snapshot: `
248
+ function foo() {
249
+ return this;
250
+ ~~~~~~~~~~~~
251
+ Unsafe return of a value of type \`any\`.
252
+ }
253
+
254
+ function bar() {
255
+ return () => this;
256
+ ~~~~
257
+ Unsafe return of a value of type \`any\`.
258
+ }
259
+ `,
260
+ },
261
+ {
262
+ code: `
263
+ declare function foo(arg: null | (() => any)): void;
264
+ foo(() => 'foo' as any);
265
+ `,
266
+ snapshot: `
267
+ declare function foo(arg: null | (() => any)): void;
268
+ foo(() => 'foo' as any);
269
+ ~~~~~~~~~~~~
270
+ Unsafe return of a value of type \`any\`.
271
+ `,
272
+ },
273
+ {
274
+ code: `
275
+ let value: NotKnown;
276
+
277
+ function example() {
278
+ return value;
279
+ }
280
+ `,
281
+ snapshot: `
282
+ let value: NotKnown;
283
+
284
+ function example() {
285
+ return value;
286
+ ~~~~~~~~~~~~~
287
+ Unsafe return of a value of type error.
288
+ }
289
+ `,
290
+ },
291
+ {
292
+ code: `
293
+ declare const value: any;
294
+ async function foo() {
295
+ return value;
296
+ }
297
+ `,
298
+ snapshot: `
299
+ declare const value: any;
300
+ async function foo() {
301
+ return value;
302
+ ~~~~~~~~~~~~~
303
+ Unsafe return of a value of type \`any\`.
304
+ }
305
+ `,
306
+ },
307
+ {
308
+ code: `
309
+ declare const value: Promise<any>;
310
+ async function foo(): Promise<number> {
311
+ return value;
312
+ }
313
+ `,
314
+ snapshot: `
315
+ declare const value: Promise<any>;
316
+ async function foo(): Promise<number> {
317
+ return value;
318
+ ~~~~~~~~~~~~~
319
+ Unsafe return of a value of type \`Promise<any>\`.
320
+ }
321
+ `,
322
+ },
323
+ {
324
+ code: `
325
+ async function foo(arg: number) {
326
+ return arg as Promise<any>;
327
+ }
328
+ `,
329
+ snapshot: `
330
+ async function foo(arg: number) {
331
+ return arg as Promise<any>;
332
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
333
+ Unsafe return of a value of type \`Promise<any>\`.
334
+ }
335
+ `,
336
+ },
337
+ {
338
+ code: `
339
+ function foo(): Promise<any> {
340
+ return {} as any;
341
+ }
342
+ `,
343
+ snapshot: `
344
+ function foo(): Promise<any> {
345
+ return {} as any;
346
+ ~~~~~~~~~~~~~~~~~
347
+ Unsafe return of a value of type \`any\`.
348
+ }
349
+ `,
350
+ },
351
+ {
352
+ code: `
353
+ function foo(): Promise<object> {
354
+ return {} as any;
355
+ }
356
+ `,
357
+ snapshot: `
358
+ function foo(): Promise<object> {
359
+ return {} as any;
360
+ ~~~~~~~~~~~~~~~~~
361
+ Unsafe return of a value of type \`any\`.
362
+ }
363
+ `,
364
+ },
365
+ {
366
+ code: `
367
+ async function foo(): Promise<object> {
368
+ return Promise.resolve<any>({});
369
+ }
370
+ `,
371
+ snapshot: `
372
+ async function foo(): Promise<object> {
373
+ return Promise.resolve<any>({});
374
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
375
+ Unsafe return of a value of type \`Promise<any>\`.
376
+ }
377
+ `,
378
+ },
379
+ {
380
+ code: `
381
+ async function foo(): Promise<object> {
382
+ return Promise.resolve<Promise<Promise<any>>>({} as Promise<any>);
383
+ }
384
+ `,
385
+ snapshot: `
386
+ async function foo(): Promise<object> {
387
+ return Promise.resolve<Promise<Promise<any>>>({} as Promise<any>);
388
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
389
+ Unsafe return of a value of type \`Promise<any>\`.
390
+ }
391
+ `,
392
+ },
393
+ {
394
+ code: `
395
+ async function foo(): Promise<object> {
396
+ return {} as Promise<Promise<Promise<Promise<any>>>>;
397
+ }
398
+ `,
399
+ snapshot: `
400
+ async function foo(): Promise<object> {
401
+ return {} as Promise<Promise<Promise<Promise<any>>>>;
402
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
403
+ Unsafe return of a value of type \`Promise<any>\`.
404
+ }
405
+ `,
406
+ },
407
+ {
408
+ code: `
409
+ async function foo() {
410
+ return {} as Promise<Promise<Promise<Promise<any>>>>;
411
+ }
412
+ `,
413
+ snapshot: `
414
+ async function foo() {
415
+ return {} as Promise<Promise<Promise<Promise<any>>>>;
416
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
417
+ Unsafe return of a value of type \`Promise<any>\`.
418
+ }
419
+ `,
420
+ },
421
+ {
422
+ code: `
423
+ async function foo() {
424
+ return {} as Promise<any> | Promise<object>;
425
+ }
426
+ `,
427
+ snapshot: `
428
+ async function foo() {
429
+ return {} as Promise<any> | Promise<object>;
430
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
431
+ Unsafe return of a value of type \`Promise<any>\`.
432
+ }
433
+ `,
434
+ },
435
+ {
436
+ code: `
437
+ async function foo() {
438
+ return {} as Promise<any | object>;
439
+ }
440
+ `,
441
+ snapshot: `
442
+ async function foo() {
443
+ return {} as Promise<any | object>;
444
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
445
+ Unsafe return of a value of type \`Promise<any>\`.
446
+ }
447
+ `,
448
+ },
449
+ {
450
+ code: `
451
+ async function foo() {
452
+ return {} as Promise<any> & { __brand: 'any' };
453
+ }
454
+ `,
455
+ snapshot: `
456
+ async function foo() {
457
+ return {} as Promise<any> & { __brand: 'any' };
458
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
459
+ Unsafe return of a value of type \`Promise<any>\`.
460
+ }
461
+ `,
462
+ },
463
+ {
464
+ code: `
465
+ interface Alias<T> extends Promise<any> {
466
+ foo: 'bar';
467
+ }
468
+
469
+ declare const value: Alias<number>;
470
+ async function foo() {
471
+ return value;
472
+ }
473
+ `,
474
+ snapshot: `
475
+ interface Alias<T> extends Promise<any> {
476
+ foo: 'bar';
477
+ }
478
+
479
+ declare const value: Alias<number>;
480
+ async function foo() {
481
+ return value;
482
+ ~~~~~~~~~~~~~
483
+ Unsafe return of a value of type \`Promise<any>\`.
484
+ }
485
+ `,
486
+ },
487
+ ],
488
+ valid: [
489
+ `
490
+ return 1 as any;
491
+ `,
492
+ `
493
+ function foo() {
494
+ return;
495
+ }
496
+ `,
497
+ `
498
+ function foo() {
499
+ return 1;
500
+ }
501
+ `,
502
+ `
503
+ function foo() {
504
+ return '';
505
+ }
506
+ `,
507
+ `
508
+ function foo() {
509
+ return true;
510
+ }
511
+ `,
512
+ // this actually types as `never[]`
513
+ `
514
+ function foo() {
515
+ return [];
516
+ }
517
+ `,
518
+ // explicit any return type is allowed, if you want to be unsafe like that
519
+ `
520
+ function foo(): any {
521
+ return {} as any;
522
+ }
523
+ `,
524
+ `
525
+ declare function foo(arg: () => any): void;
526
+ foo((): any => 'foo' as any);
527
+ `,
528
+ `
529
+ declare function foo(arg: null | (() => any)): void;
530
+ foo((): any => 'foo' as any);
531
+ `,
532
+ // explicit any array return type is allowed, if you want to be unsafe like that
533
+ `
534
+ function foo(): any[] {
535
+ return [] as any[];
536
+ }
537
+ `,
538
+ // explicit any generic return type is allowed, if you want to be unsafe like that
539
+ `
540
+ function foo(): Set<any> {
541
+ return new Set<any>();
542
+ }
543
+ `,
544
+ `
545
+ async function foo(): Promise<any> {
546
+ return Promise.resolve({} as any);
547
+ }
548
+ `,
549
+ `
550
+ async function foo(): Promise<any> {
551
+ return {} as any;
552
+ }
553
+ `,
554
+ `
555
+ function foo(): object {
556
+ return Promise.resolve({} as any);
557
+ }
558
+ `,
559
+ // TODO - this should error, but it's hard to detect, as the type references are different
560
+ `
561
+ function foo(): ReadonlySet<number> {
562
+ return new Set<any>();
563
+ }
564
+ `,
565
+ `
566
+ function foo(): Set<number> {
567
+ return new Set([1]);
568
+ }
569
+ `,
570
+ `
571
+ type Foo<T = number> = { prop: T };
572
+ function foo(): Foo {
573
+ return { prop: 1 } as Foo<number>;
574
+ }
575
+ `,
576
+ `
577
+ type Foo = { prop: any };
578
+ function foo(): Foo {
579
+ return { prop: '' } as Foo;
580
+ }
581
+ `,
582
+ // TS 3.9 changed this to be safe
583
+ `
584
+ function fn<T extends any>(x: T) {
585
+ return x;
586
+ }
587
+ `,
588
+ `
589
+ function fn<T extends any>(x: T): unknown {
590
+ return x as any;
591
+ }
592
+ `,
593
+ `
594
+ function fn<T extends any>(x: T): unknown[] {
595
+ return x as any[];
596
+ }
597
+ `,
598
+ `
599
+ function fn<T extends any>(x: T): Set<unknown> {
600
+ return x as Set<any>;
601
+ }
602
+ `,
603
+ `
604
+ async function fn<T extends any>(x: T): Promise<unknown> {
605
+ return x as any;
606
+ }
607
+ `,
608
+ `
609
+ function fn<T extends any>(x: T): Promise<unknown> {
610
+ return Promise.resolve(x as any);
611
+ }
612
+ `,
613
+ // https://github.com/typescript-eslint/typescript-eslint/issues/2109
614
+ `
615
+ function test(): Map<string, string> {
616
+ return new Map();
617
+ }
618
+ `,
619
+ // https://github.com/typescript-eslint/typescript-eslint/issues/3549
620
+ `
621
+ function foo(): any {
622
+ return [] as any[];
623
+ }
624
+ `,
625
+ `
626
+ function foo(): unknown {
627
+ return [] as any[];
628
+ }
629
+ `,
630
+ `
631
+ declare const value: Promise<any>;
632
+ function foo() {
633
+ return value;
634
+ }
635
+ `,
636
+ "const foo: (() => void) | undefined = () => 1;",
637
+ `
638
+ class Foo {
639
+ public foo(): this {
640
+ return this;
641
+ }
642
+
643
+ protected then(resolve: () => void): void {
644
+ resolve();
645
+ }
646
+ }
647
+ `,
648
+ ],
649
+ });