@typescript-eslint/eslint-plugin 8.0.0-alpha.3 → 8.0.0-alpha.31

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 (247) hide show
  1. package/dist/configs/all.js +5 -6
  2. package/dist/configs/all.js.map +1 -1
  3. package/dist/configs/disable-type-checked.js +1 -2
  4. package/dist/configs/disable-type-checked.js.map +1 -1
  5. package/dist/configs/recommended-type-checked-only.js +6 -0
  6. package/dist/configs/recommended-type-checked-only.js.map +1 -1
  7. package/dist/configs/recommended-type-checked.js +13 -2
  8. package/dist/configs/recommended-type-checked.js.map +1 -1
  9. package/dist/configs/recommended.js +7 -2
  10. package/dist/configs/recommended.js.map +1 -1
  11. package/dist/configs/strict-type-checked-only.js +2 -2
  12. package/dist/configs/strict-type-checked-only.js.map +1 -1
  13. package/dist/configs/strict-type-checked.js +9 -5
  14. package/dist/configs/strict-type-checked.js.map +1 -1
  15. package/dist/configs/strict.js +7 -3
  16. package/dist/configs/strict.js.map +1 -1
  17. package/dist/configs/stylistic-type-checked-only.js +3 -0
  18. package/dist/configs/stylistic-type-checked-only.js.map +1 -1
  19. package/dist/configs/stylistic-type-checked.js +3 -2
  20. package/dist/configs/stylistic-type-checked.js.map +1 -1
  21. package/dist/configs/stylistic.js +0 -2
  22. package/dist/configs/stylistic.js.map +1 -1
  23. package/dist/rules/adjacent-overload-signatures.js +2 -6
  24. package/dist/rules/adjacent-overload-signatures.js.map +1 -1
  25. package/dist/rules/class-literal-property-style.js +9 -7
  26. package/dist/rules/class-literal-property-style.js.map +1 -1
  27. package/dist/rules/consistent-type-assertions.js +5 -19
  28. package/dist/rules/consistent-type-assertions.js.map +1 -1
  29. package/dist/rules/consistent-type-definitions.js +1 -1
  30. package/dist/rules/consistent-type-definitions.js.map +1 -1
  31. package/dist/rules/default-param-last.js +6 -1
  32. package/dist/rules/default-param-last.js.map +1 -1
  33. package/dist/rules/dot-notation.js +8 -1
  34. package/dist/rules/dot-notation.js.map +1 -1
  35. package/dist/rules/enum-utils/shared.js +3 -4
  36. package/dist/rules/enum-utils/shared.js.map +1 -1
  37. package/dist/rules/explicit-member-accessibility.js +49 -37
  38. package/dist/rules/explicit-member-accessibility.js.map +1 -1
  39. package/dist/rules/index.js +10 -6
  40. package/dist/rules/index.js.map +1 -1
  41. package/dist/rules/init-declarations.js +57 -1
  42. package/dist/rules/init-declarations.js.map +1 -1
  43. package/dist/rules/member-ordering.js +8 -2
  44. package/dist/rules/member-ordering.js.map +1 -1
  45. package/dist/rules/naming-convention-utils/parse-options.js +2 -5
  46. package/dist/rules/naming-convention-utils/parse-options.js.map +1 -1
  47. package/dist/rules/naming-convention-utils/shared.js +3 -4
  48. package/dist/rules/naming-convention-utils/shared.js.map +1 -1
  49. package/dist/rules/naming-convention-utils/validator.js +1 -2
  50. package/dist/rules/naming-convention-utils/validator.js.map +1 -1
  51. package/dist/rules/naming-convention.js +3 -1
  52. package/dist/rules/naming-convention.js.map +1 -1
  53. package/dist/rules/no-array-delete.js +1 -1
  54. package/dist/rules/no-array-delete.js.map +1 -1
  55. package/dist/rules/no-base-to-string.js +1 -1
  56. package/dist/rules/no-base-to-string.js.map +1 -1
  57. package/dist/rules/no-duplicate-type-constituents.js +1 -1
  58. package/dist/rules/no-duplicate-type-constituents.js.map +1 -1
  59. package/dist/rules/no-dynamic-delete.js +8 -40
  60. package/dist/rules/no-dynamic-delete.js.map +1 -1
  61. package/dist/rules/no-empty-interface.js +2 -1
  62. package/dist/rules/no-empty-interface.js.map +1 -1
  63. package/dist/rules/no-empty-object-type.js +141 -0
  64. package/dist/rules/no-empty-object-type.js.map +1 -0
  65. package/dist/rules/no-extraneous-class.js +11 -3
  66. package/dist/rules/no-extraneous-class.js.map +1 -1
  67. package/dist/rules/no-floating-promises.js +62 -39
  68. package/dist/rules/no-floating-promises.js.map +1 -1
  69. package/dist/rules/no-implied-eval.js +1 -8
  70. package/dist/rules/no-implied-eval.js.map +1 -1
  71. package/dist/rules/no-inferrable-types.js +1 -2
  72. package/dist/rules/no-inferrable-types.js.map +1 -1
  73. package/dist/rules/no-invalid-this.js +6 -0
  74. package/dist/rules/no-invalid-this.js.map +1 -1
  75. package/dist/rules/no-magic-numbers.js +32 -1
  76. package/dist/rules/no-magic-numbers.js.map +1 -1
  77. package/dist/rules/no-misused-new.js +4 -3
  78. package/dist/rules/no-misused-new.js.map +1 -1
  79. package/dist/rules/no-require-imports.js +13 -3
  80. package/dist/rules/no-require-imports.js.map +1 -1
  81. package/dist/rules/no-restricted-imports.js +3 -6
  82. package/dist/rules/no-restricted-imports.js.map +1 -1
  83. package/dist/rules/{ban-types.js → no-restricted-types.js} +17 -91
  84. package/dist/rules/no-restricted-types.js.map +1 -0
  85. package/dist/rules/no-shadow.js +1 -1
  86. package/dist/rules/no-shadow.js.map +1 -1
  87. package/dist/rules/{no-useless-template-literals.js → no-unnecessary-template-expression.js} +6 -6
  88. package/dist/rules/no-unnecessary-template-expression.js.map +1 -0
  89. package/dist/rules/no-unnecessary-type-assertion.js +15 -13
  90. package/dist/rules/no-unnecessary-type-assertion.js.map +1 -1
  91. package/dist/rules/no-unsafe-argument.js +4 -2
  92. package/dist/rules/no-unsafe-argument.js.map +1 -1
  93. package/dist/rules/no-unsafe-assignment.js +24 -9
  94. package/dist/rules/no-unsafe-assignment.js.map +1 -1
  95. package/dist/rules/no-unsafe-function-type.js +47 -0
  96. package/dist/rules/no-unsafe-function-type.js.map +1 -0
  97. package/dist/rules/no-unsafe-member-access.js +8 -2
  98. package/dist/rules/no-unsafe-member-access.js.map +1 -1
  99. package/dist/rules/no-unsafe-return.js +1 -1
  100. package/dist/rules/no-unsafe-return.js.map +1 -1
  101. package/dist/rules/no-unsafe-unary-minus.js +1 -0
  102. package/dist/rules/no-unsafe-unary-minus.js.map +1 -1
  103. package/dist/rules/no-unused-expressions.js +1 -0
  104. package/dist/rules/no-unused-expressions.js.map +1 -1
  105. package/dist/rules/no-unused-vars.js +191 -77
  106. package/dist/rules/no-unused-vars.js.map +1 -1
  107. package/dist/rules/no-useless-constructor.js +0 -1
  108. package/dist/rules/no-useless-constructor.js.map +1 -1
  109. package/dist/rules/no-var-requires.js +2 -1
  110. package/dist/rules/no-var-requires.js.map +1 -1
  111. package/dist/rules/no-wrapper-object-types.js +61 -0
  112. package/dist/rules/no-wrapper-object-types.js.map +1 -0
  113. package/dist/rules/only-throw-error.js +1 -1
  114. package/dist/rules/only-throw-error.js.map +1 -1
  115. package/dist/rules/prefer-as-const.js +1 -1
  116. package/dist/rules/prefer-as-const.js.map +1 -1
  117. package/dist/rules/prefer-destructuring.js +3 -1
  118. package/dist/rules/prefer-destructuring.js.map +1 -1
  119. package/dist/rules/prefer-find.js +1 -0
  120. package/dist/rules/prefer-find.js.map +1 -1
  121. package/dist/rules/prefer-includes.js +1 -1
  122. package/dist/rules/prefer-includes.js.map +1 -1
  123. package/dist/rules/prefer-literal-enum-member.js +43 -2
  124. package/dist/rules/prefer-literal-enum-member.js.map +1 -1
  125. package/dist/rules/prefer-namespace-keyword.js +1 -1
  126. package/dist/rules/prefer-namespace-keyword.js.map +1 -1
  127. package/dist/rules/prefer-nullish-coalescing.js +8 -6
  128. package/dist/rules/prefer-nullish-coalescing.js.map +1 -1
  129. package/dist/rules/prefer-optional-chain-utils/analyzeChain.js +1 -2
  130. package/dist/rules/prefer-optional-chain-utils/analyzeChain.js.map +1 -1
  131. package/dist/rules/prefer-optional-chain-utils/checkNullishAndReport.js +1 -2
  132. package/dist/rules/prefer-optional-chain-utils/checkNullishAndReport.js.map +1 -1
  133. package/dist/rules/prefer-optional-chain-utils/compareNodes.js +1 -2
  134. package/dist/rules/prefer-optional-chain-utils/compareNodes.js.map +1 -1
  135. package/dist/rules/prefer-optional-chain-utils/gatherLogicalOperands.js +6 -11
  136. package/dist/rules/prefer-optional-chain-utils/gatherLogicalOperands.js.map +1 -1
  137. package/dist/rules/prefer-promise-reject-errors.js +1 -1
  138. package/dist/rules/prefer-promise-reject-errors.js.map +1 -1
  139. package/dist/rules/prefer-readonly.js +24 -12
  140. package/dist/rules/prefer-readonly.js.map +1 -1
  141. package/dist/rules/prefer-regexp-exec.js +15 -6
  142. package/dist/rules/prefer-regexp-exec.js.map +1 -1
  143. package/dist/rules/prefer-string-starts-ends-with.js.map +1 -1
  144. package/dist/rules/prefer-ts-expect-error.js +2 -1
  145. package/dist/rules/prefer-ts-expect-error.js.map +1 -1
  146. package/dist/rules/require-await.js +1 -1
  147. package/dist/rules/require-await.js.map +1 -1
  148. package/dist/rules/restrict-template-expressions.js +2 -2
  149. package/dist/rules/restrict-template-expressions.js.map +1 -1
  150. package/dist/rules/return-await.js +117 -52
  151. package/dist/rules/return-await.js.map +1 -1
  152. package/dist/rules/sort-type-constituents.js +23 -1
  153. package/dist/rules/sort-type-constituents.js.map +1 -1
  154. package/dist/rules/strict-boolean-expressions.js +1 -3
  155. package/dist/rules/strict-boolean-expressions.js.map +1 -1
  156. package/dist/rules/switch-exhaustiveness-check.js +7 -9
  157. package/dist/rules/switch-exhaustiveness-check.js.map +1 -1
  158. package/dist/rules/unified-signatures.js +3 -1
  159. package/dist/rules/unified-signatures.js.map +1 -1
  160. package/dist/util/astUtils.js +2 -3
  161. package/dist/util/astUtils.js.map +1 -1
  162. package/dist/util/collectUnusedVariables.js +81 -64
  163. package/dist/util/collectUnusedVariables.js.map +1 -1
  164. package/dist/util/createRule.js.map +1 -1
  165. package/dist/util/escapeRegExp.js +1 -2
  166. package/dist/util/escapeRegExp.js.map +1 -1
  167. package/dist/util/explicitReturnTypeUtils.js +11 -7
  168. package/dist/util/explicitReturnTypeUtils.js.map +1 -1
  169. package/dist/util/getESLintCoreRule.js +2 -2
  170. package/dist/util/getESLintCoreRule.js.map +1 -1
  171. package/dist/util/getForStatementHeadLoc.js +1 -2
  172. package/dist/util/getForStatementHeadLoc.js.map +1 -1
  173. package/dist/util/getFunctionHeadLoc.js +1 -2
  174. package/dist/util/getFunctionHeadLoc.js.map +1 -1
  175. package/dist/util/getMemberHeadLoc.js +80 -0
  176. package/dist/util/getMemberHeadLoc.js.map +1 -0
  177. package/dist/util/getOperatorPrecedence.js +5 -5
  178. package/dist/util/getOperatorPrecedence.js.map +1 -1
  179. package/dist/util/getStaticStringValue.js +1 -2
  180. package/dist/util/getStaticStringValue.js.map +1 -1
  181. package/dist/util/getStringLength.js +1 -2
  182. package/dist/util/getStringLength.js.map +1 -1
  183. package/dist/util/getTextWithParentheses.js +17 -0
  184. package/dist/util/getTextWithParentheses.js.map +1 -0
  185. package/dist/util/getThisExpression.js +1 -2
  186. package/dist/util/getThisExpression.js.map +1 -1
  187. package/dist/util/getWrappedCode.js +1 -2
  188. package/dist/util/getWrappedCode.js.map +1 -1
  189. package/dist/util/getWrappingFixer.js +2 -3
  190. package/dist/util/getWrappingFixer.js.map +1 -1
  191. package/dist/util/index.js +2 -0
  192. package/dist/util/index.js.map +1 -1
  193. package/dist/util/isAssignee.js +1 -2
  194. package/dist/util/isAssignee.js.map +1 -1
  195. package/dist/util/isNodeEqual.js +1 -2
  196. package/dist/util/isNodeEqual.js.map +1 -1
  197. package/dist/util/isNullLiteral.js +1 -2
  198. package/dist/util/isNullLiteral.js.map +1 -1
  199. package/dist/util/isUndefinedIdentifier.js +1 -2
  200. package/dist/util/isUndefinedIdentifier.js.map +1 -1
  201. package/dist/util/misc.js +14 -14
  202. package/dist/util/misc.js.map +1 -1
  203. package/dist/util/objectIterators.js +3 -4
  204. package/dist/util/objectIterators.js.map +1 -1
  205. package/dist/util/scopeUtils.js +11 -0
  206. package/dist/util/scopeUtils.js.map +1 -0
  207. package/docs/rules/ban-types.md +22 -0
  208. package/docs/rules/consistent-indexed-object-style.mdx +1 -1
  209. package/docs/rules/consistent-type-imports.mdx +1 -1
  210. package/docs/rules/naming-convention.mdx +16 -0
  211. package/docs/rules/no-base-to-string.mdx +1 -1
  212. package/docs/rules/no-duplicate-imports.mdx +1 -1
  213. package/docs/rules/no-dynamic-delete.mdx +12 -7
  214. package/docs/rules/no-empty-interface.mdx +10 -0
  215. package/docs/rules/no-empty-object-type.mdx +145 -0
  216. package/docs/rules/no-extraneous-class.mdx +6 -0
  217. package/docs/rules/no-floating-promises.mdx +103 -4
  218. package/docs/rules/no-import-type-side-effects.mdx +1 -1
  219. package/docs/rules/no-misused-promises.mdx +18 -20
  220. package/docs/rules/no-require-imports.mdx +28 -1
  221. package/docs/rules/no-restricted-types.mdx +71 -0
  222. package/docs/rules/no-type-alias.mdx +1 -1
  223. package/docs/rules/no-unnecessary-boolean-literal-compare.mdx +12 -12
  224. package/docs/rules/no-unnecessary-template-expression.mdx +85 -0
  225. package/docs/rules/no-unsafe-function-type.mdx +63 -0
  226. package/docs/rules/no-unused-expressions.mdx +41 -1
  227. package/docs/rules/no-unused-vars.mdx +5 -0
  228. package/docs/rules/no-useless-template-literals.mdx +3 -59
  229. package/docs/rules/no-var-requires.mdx +6 -0
  230. package/docs/rules/no-wrapper-object-types.mdx +67 -0
  231. package/docs/rules/only-throw-error.mdx +7 -0
  232. package/docs/rules/prefer-readonly-parameter-types.mdx +10 -4
  233. package/docs/rules/prefer-ts-expect-error.mdx +10 -0
  234. package/docs/rules/require-await.mdx +2 -2
  235. package/docs/rules/restrict-template-expressions.mdx +1 -1
  236. package/docs/rules/return-await.mdx +55 -21
  237. package/docs/rules/sort-type-constituents.mdx +29 -9
  238. package/docs/rules/sort-type-union-intersection-members.mdx +12 -0
  239. package/docs/rules/unbound-method.mdx +3 -2
  240. package/package.json +14 -19
  241. package/rules.d.ts +6 -2
  242. package/dist/rules/ban-types.js.map +0 -1
  243. package/dist/rules/no-throw-literal.js +0 -97
  244. package/dist/rules/no-throw-literal.js.map +0 -1
  245. package/dist/rules/no-useless-template-literals.js.map +0 -1
  246. package/docs/rules/ban-types.mdx +0 -138
  247. package/docs/rules/no-throw-literal.mdx +0 -25
@@ -0,0 +1,85 @@
1
+ ---
2
+ description: 'Disallow unnecessary template expressions.'
3
+ ---
4
+
5
+ import Tabs from '@theme/Tabs';
6
+ import TabItem from '@theme/TabItem';
7
+
8
+ > 🛑 This file is source code, not the primary documentation location! 🛑
9
+ >
10
+ > See **https://typescript-eslint.io/rules/no-unnecessary-template-expression** for documentation.
11
+
12
+ This rule reports template literals that contain substitution expressions (also variously referred to as embedded expressions or string interpolations) that are unnecessary and can be simplified.
13
+
14
+ :::info[Migration from `no-useless-template-literals`]
15
+
16
+ This rule was formerly known as [`no-useless-template-literals`](./no-useless-template-literals.mdx).
17
+ The new name is a drop-in replacement with identical functionality.
18
+
19
+ :::
20
+
21
+ ## Examples
22
+
23
+ <Tabs>
24
+ <TabItem value="❌ Incorrect">
25
+
26
+ ```ts
27
+ // Static values can be incorporated into the surrounding template.
28
+
29
+ const ab1 = `${'a'}${'b'}`;
30
+ const ab2 = `a${'b'}`;
31
+
32
+ const stringWithNumber = `${'1 + 1 = '}${2}`;
33
+
34
+ const stringWithBoolean = `${'true is '}${true}`;
35
+
36
+ // Some simple expressions that are already strings
37
+ // can be rewritten without a template at all.
38
+
39
+ const text = 'a';
40
+ const wrappedText = `${text}`;
41
+
42
+ declare const intersectionWithString: string & { _brand: 'test-brand' };
43
+ const wrappedIntersection = `${intersectionWithString}`;
44
+ ```
45
+
46
+ </TabItem>
47
+ <TabItem value="✅ Correct">
48
+
49
+ ```ts
50
+ // Static values can be incorporated into the surrounding template.
51
+
52
+ const ab1 = `ab`;
53
+ const ab2 = `ab`;
54
+
55
+ const stringWithNumber = `1 + 1 = 2`;
56
+
57
+ const stringWithBoolean = `true is true`;
58
+
59
+ // Some simple expressions that are already strings
60
+ // can be rewritten without a template at all.
61
+
62
+ const text = 'a';
63
+ const wrappedText = text;
64
+
65
+ declare const intersectionWithString: string & { _brand: 'test-brand' };
66
+ const wrappedIntersection = intersectionWithString;
67
+ ```
68
+
69
+ </TabItem>
70
+ </Tabs>
71
+
72
+ :::info
73
+ This rule does not aim to flag template literals without substitution expressions that could have been written as an ordinary string.
74
+ That is to say, this rule will not help you turn `` `this` `` into `"this"`.
75
+ If you are looking for such a rule, you can configure the [`@stylistic/ts/quotes`](https://eslint.style/rules/ts/quotes) rule to do this.
76
+ :::
77
+
78
+ ## When Not To Use It
79
+
80
+ When you want to allow string expressions inside template literals.
81
+
82
+ ## Related To
83
+
84
+ - [`restrict-template-expressions`](./restrict-template-expressions.mdx)
85
+ - [`@stylistic/ts/quotes`](https://eslint.style/rules/ts/quotes)
@@ -0,0 +1,63 @@
1
+ ---
2
+ description: 'Disallow using the unsafe built-in Function type.'
3
+ ---
4
+
5
+ import Tabs from '@theme/Tabs';
6
+ import TabItem from '@theme/TabItem';
7
+
8
+ > 🛑 This file is source code, not the primary documentation location! 🛑
9
+ >
10
+ > See **https://typescript-eslint.io/rules/no-unsafe-function-type** for documentation.
11
+
12
+ TypeScript's built-in `Function` type allows being called with any number of arguments and returns type `any`.
13
+ `Function` also allows classes or plain objects that happen to possess all properties of the `Function` class.
14
+ It's generally better to specify function parameters and return types with the function type syntax.
15
+
16
+ "Catch-all" function types include:
17
+
18
+ - `() => void`: a function that has no parameters and whose return is ignored
19
+ - `(...args: never) => unknown`: a "top type" for functions that can be assigned any function type, but can't be called
20
+
21
+ Examples of code for this rule:
22
+
23
+ <Tabs>
24
+ <TabItem value="❌ Incorrect">
25
+
26
+ ```ts
27
+ let noParametersOrReturn: Function;
28
+ noParametersOrReturn = () => {};
29
+
30
+ let stringToNumber: Function;
31
+ stringToNumber = (text: string) => text.length;
32
+
33
+ let identity: Function;
34
+ identity = value => value;
35
+ ```
36
+
37
+ </TabItem>
38
+ <TabItem value="✅ Correct">
39
+
40
+ ```ts
41
+ let noParametersOrReturn: () => void;
42
+ noParametersOrReturn = () => {};
43
+
44
+ let stringToNumber: (text: string) => number;
45
+ stringToNumber = text => text.length;
46
+
47
+ let identity: <T>(value: T) => T;
48
+ identity = value => value;
49
+ ```
50
+
51
+ </TabItem>
52
+ </Tabs>
53
+
54
+ ## When Not To Use It
55
+
56
+ If your project is still onboarding to TypeScript, it might be difficult to fully replace all unsafe `Function` types with more precise function types.
57
+ You might consider using [ESLint disable comments](https://eslint.org/docs/latest/use/configure/rules#using-configuration-comments-1) for those specific situations instead of completely disabling this rule.
58
+
59
+ ## Related To
60
+
61
+ - [`no-empty-object-type`](./no-empty-object-type.mdx)
62
+ - [`no-restricted-types`](./no-restricted-types.mdx)
63
+ - [`no-wrapper-object-types`](./no-wrapper-object-types.mdx)
@@ -10,4 +10,44 @@ import TabItem from '@theme/TabItem';
10
10
  > See **https://typescript-eslint.io/rules/no-unused-expressions** for documentation.
11
11
 
12
12
  This rule extends the base [`eslint/no-unused-expressions`](https://eslint.org/docs/rules/no-unused-expressions) rule.
13
- It adds support for optional call expressions `x?.()`, and directive in module declarations.
13
+ It supports TypeScript-specific expressions:
14
+
15
+ - Marks directives in modules declarations (`"use strict"`, etc.) as not unused
16
+ - Marks the following expressions as unused if their wrapped value expressions are unused:
17
+ - Assertion expressions: `x as number;`, `x!;`, `<number>x;`
18
+ - Instantiation expressions: `Set<number>;`
19
+
20
+ Although the type expressions never have runtime side effects (that is, `x!;` is the same as `x;`), they can be used to assert types for testing purposes.
21
+
22
+ ## Examples
23
+
24
+ <Tabs>
25
+ <TabItem value="❌ Incorrect">
26
+
27
+ ```ts
28
+ Set<number>;
29
+ 1 as number;
30
+ window!;
31
+ ```
32
+
33
+ </TabItem>
34
+ <TabItem value="✅ Correct">
35
+
36
+ ```ts
37
+ function getSet() {
38
+ return Set;
39
+ }
40
+
41
+ // Funtion calls are allowed, so type expressions that wrap function calls are allowed
42
+ getSet()<number>;
43
+ getSet() as Set<unknown>;
44
+ getSet()!;
45
+
46
+ // Namespaces can have directives
47
+ namespace A {
48
+ 'use strict';
49
+ }
50
+ ```
51
+
52
+ </TabItem>
53
+ </Tabs>
@@ -47,3 +47,8 @@ We generally recommend using `@typescript-eslint/no-unused-vars` to flag unused
47
47
  :::tip
48
48
  Editors such as VS Code will still generally "grey out" unused variables even if `noUnusedLocals` and `noUnusedParameters` are not enabled in a project.
49
49
  :::
50
+
51
+ Also see similar rules provided by ESLint:
52
+
53
+ - [`no-unused-private-class-members`](https://eslint.org/docs/latest/rules/no-unused-private-class-members)
54
+ - [`no-unused-labels`](https://eslint.org/docs/latest/rules/no-unused-labels)
@@ -1,61 +1,5 @@
1
- ---
2
- description: 'Disallow unnecessary template literals.'
3
- ---
1
+ :::danger Deprecated
4
2
 
5
- import Tabs from '@theme/Tabs';
6
- import TabItem from '@theme/TabItem';
3
+ This rule has been renamed to [`no-unnecessary-template-expression`](./no-unnecessary-template-expression.mdx). See [#8544](https://github.com/typescript-eslint/typescript-eslint/issues/8544) for more information.
7
4
 
8
- > 🛑 This file is source code, not the primary documentation location! 🛑
9
- >
10
- > See **https://typescript-eslint.io/rules/no-useless-template-literals** for documentation.
11
-
12
- This rule reports template literals that can be simplified to a normal string literal.
13
-
14
- ## Examples
15
-
16
- <Tabs>
17
- <TabItem value="❌ Incorrect">
18
-
19
- ```ts
20
- const ab1 = `${'a'}${'b'}`;
21
- const ab2 = `a${'b'}`;
22
-
23
- const stringWithNumber = `${'1 + 1 = '}${2}`;
24
-
25
- const stringWithBoolean = `${'true is '}${true}`;
26
-
27
- const text = 'a';
28
- const wrappedText = `${text}`;
29
-
30
- declare const intersectionWithString: string & { _brand: 'test-brand' };
31
- const wrappedIntersection = `${intersectionWithString}`;
32
- ```
33
-
34
- </TabItem>
35
- <TabItem value="✅ Correct">
36
-
37
- ```ts
38
- const ab1 = 'ab';
39
- const ab2 = 'ab';
40
-
41
- const stringWithNumber = `1 + 1 = 2`;
42
-
43
- const stringWithBoolean = `true is true`;
44
-
45
- const text = 'a';
46
- const wrappedText = text;
47
-
48
- declare const intersectionWithString: string & { _brand: 'test-brand' };
49
- const wrappedIntersection = intersectionWithString;
50
- ```
51
-
52
- </TabItem>
53
- </Tabs>
54
-
55
- ## When Not To Use It
56
-
57
- When you want to allow string expressions inside template literals.
58
-
59
- ## Related To
60
-
61
- - [`restrict-template-expressions`](./restrict-template-expressions.mdx)
5
+ :::
@@ -9,6 +9,12 @@ import TabItem from '@theme/TabItem';
9
9
  >
10
10
  > See **https://typescript-eslint.io/rules/no-var-requires** for documentation.
11
11
 
12
+ :::danger Deprecated
13
+
14
+ This rule has been deprecated in favour of the [`@typescript-eslint/no-require-imports`](./no-require-imports.mdx) rule.
15
+
16
+ :::
17
+
12
18
  In other words, the use of forms such as `var foo = require("foo")` are banned. Instead use ES6 style imports or `import foo = require("foo")` imports.
13
19
 
14
20
  ## Examples
@@ -0,0 +1,67 @@
1
+ ---
2
+ description: 'Disallow using confusing built-in primitive class wrappers.'
3
+ ---
4
+
5
+ import Tabs from '@theme/Tabs';
6
+ import TabItem from '@theme/TabItem';
7
+
8
+ > 🛑 This file is source code, not the primary documentation location! 🛑
9
+ >
10
+ > See **https://typescript-eslint.io/rules/no-wrapper-object-types** for documentation.
11
+
12
+ The JavaScript language has a set of language types, but some of them correspond to two TypeScript types, which look similar: `boolean`/`Boolean`, `number`/`Number`, `string`/`String`, `bigint`/`BigInt`, `symbol`/`Symbol`, `object`/`Object`.
13
+ The difference is that the lowercase variants are compiler intrinsics and specify the actual _runtime types_ (that is, the return value when you use the `typeof` operator), while the uppercase variants are _structural types_ defined in the library that can be satisfied by any user-defined object with the right properties, not just the real primitives.
14
+ JavaScript also has a "wrapper" class object for each of those primitives, such as [`Boolean`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean) and [`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number).
15
+ These wrapper objects are assignable to the uppercase types, but not to the lowercase types.
16
+
17
+ Using the primitives like `0` instead of object wrappers like `new Number(0)` is generally considered a JavaScript best practice.
18
+ JavaScript programs typically work with the real number primitives, rather than objects that "look like" numbers.
19
+ Primitives are simpler to conceptualize and work with `==` and `===` equality checks -- which their object equivalents do notDeepEqual.
20
+ As a result, using the lowercase type names like `number` instead of the uppercase names like `Number` helps make your code behave more reliably.
21
+
22
+ Examples of code for this rule:
23
+
24
+ <Tabs>
25
+ <TabItem value="❌ Incorrect">
26
+
27
+ ```ts
28
+ let myBigInt: BigInt;
29
+ let myBoolean: Boolean;
30
+ let myNumber: Number;
31
+ let myString: String;
32
+ let mySymbol: Symbol;
33
+
34
+ let myObject: Object = 'allowed by TypeScript';
35
+ ```
36
+
37
+ </TabItem>
38
+ <TabItem value="✅ Correct">
39
+
40
+ ```ts
41
+ let myBigint: bigint;
42
+ let myBoolean: boolean;
43
+ let myNumber: number;
44
+ let myString: string;
45
+ let mySymbol: symbol;
46
+
47
+ let myObject: object = "Type 'string' is not assignable to type 'object'.";
48
+ ```
49
+
50
+ </TabItem>
51
+ </Tabs>
52
+
53
+ ## When Not To Use It
54
+
55
+ If your project is a rare one that intentionally deals with the class equivalents of primitives, it might not be worthwhile to use this rule.
56
+ You might consider using [ESLint disable comments](https://eslint.org/docs/latest/use/configure/rules#using-configuration-comments-1) for those specific situations instead of completely disabling this rule.
57
+
58
+ ## Further Reading
59
+
60
+ - [MDN documentation on primitives](https://developer.mozilla.org/en-US/docs/Glossary/Primitive)
61
+ - [MDN documentation on `string` primitives and `String` objects](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#string_primitives_and_string_objects)
62
+
63
+ ## Related To
64
+
65
+ - [`no-empty-object-type`](./no-empty-object-type.mdx)
66
+ - [`no-restricted-types`](./no-restricted-types.mdx)
67
+ - [`no-unsafe-function-type`](./no-unsafe-function-type.mdx)
@@ -14,6 +14,13 @@ The fundamental benefit of `Error` objects is that they automatically keep track
14
14
 
15
15
  This rule restricts what can be thrown as an exception.
16
16
 
17
+ :::info[Migration from `no-throw-literal`]
18
+
19
+ This rule was formerly known as `no-throw-literal`.
20
+ The new name is a drop-in replacement with identical functionality.
21
+
22
+ :::
23
+
17
24
  ## Examples
18
25
 
19
26
  This rule is aimed at maintaining consistency when throwing exception by disallowing to throw literals and other expressions which cannot possibly be an `Error` object.
@@ -142,11 +142,12 @@ interface Foo {
142
142
 
143
143
  Some complex types cannot easily be made readonly, for example the `HTMLElement` type or the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types.
144
144
 
145
- Each item must be one of:
145
+ This option takes an array of type specifiers to ignore.
146
+ Each item in the array must have one of the following forms:
146
147
 
147
- - A type defined in a file (`{from: "file", name: "Foo", path: "src/foo-file.ts"}` with `path` being an optional path relative to the project root directory)
148
- - A type from the default library (`{from: "lib", name: "Foo"}`)
149
- - A type from a package (`{from: "package", name: "Foo", package: "foo-lib"}`, this also works for types defined in a typings package).
148
+ - A type defined in a file (`{ from: "file", name: "Foo", path: "src/foo-file.ts" }` with `path` being an optional path relative to the project root directory)
149
+ - A type from the default library (`{ from: "lib", name: "Foo" }`)
150
+ - A type from a package (`{ from: "package", name: "Foo", package: "foo-lib" }`, this also works for types defined in a typings package).
150
151
 
151
152
  Additionally, a type may be defined just as a simple string, which then matches the type independently of its origin.
152
153
 
@@ -401,3 +402,8 @@ function foo(arg: MyType) {}
401
402
  ## When Not To Use It
402
403
 
403
404
  If your project does not attempt to enforce strong immutability guarantees of parameters, you can avoid this rule.
405
+
406
+ This rule is very strict on what it considers mutable.
407
+ Many types that describe themselves as readonly are considered mutable because they have mutable properties such as arrays or tuples.
408
+ To work around these limitations, you might need to use the rule's options.
409
+ In particular, the [`allow` option](#allow) can explicitly mark a type as readonly.
@@ -9,6 +9,16 @@ import TabItem from '@theme/TabItem';
9
9
  >
10
10
  > See **https://typescript-eslint.io/rules/prefer-ts-expect-error** for documentation.
11
11
 
12
+ :::danger Deprecated
13
+
14
+ This rule has been deprecated in favor of [`@typescript-eslint/ban-ts-comment`](./ban-ts-comment.mdx).
15
+ This rule (`@typescript-eslint/prefer-ts-expect-error`) will be removed in a future major version of typescript-eslint.
16
+
17
+ When it was first created, `@typescript-eslint/ban-ts-comment` rule was only responsible for suggesting to remove `@ts-ignore` directive.
18
+ It was later updated to suggest replacing `@ts-ignore` with `@ts-expect-error` directive, so that it replaces `@typescript-eslint/prefer-ts-expect-error` entirely.
19
+
20
+ :::
21
+
12
22
  TypeScript allows you to suppress all errors on a line by placing a comment starting with `@ts-ignore` or `@ts-expect-error` immediately before the erroring line.
13
23
  The two directives work the same, except `@ts-expect-error` causes a type error if placed before a line that's not erroring in the first place.
14
24
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: 'Disallow async functions which have no `await` expression.'
2
+ description: 'Disallow async functions which do not return promises and have no `await` expression.'
3
3
  ---
4
4
 
5
5
  import Tabs from '@theme/Tabs';
@@ -10,7 +10,7 @@ import TabItem from '@theme/TabItem';
10
10
  > See **https://typescript-eslint.io/rules/require-await** for documentation.
11
11
 
12
12
  This rule extends the base [`eslint/require-await`](https://eslint.org/docs/rules/require-await) rule.
13
- It uses type information to add support for `async` functions that return a `Promise`.
13
+ It uses type information to allow promise-returning functions to be marked as `async` without containing an `await` expression.
14
14
 
15
15
  ## Examples
16
16
 
@@ -10,7 +10,7 @@ import TabItem from '@theme/TabItem';
10
10
  > See **https://typescript-eslint.io/rules/restrict-template-expressions** for documentation.
11
11
 
12
12
  JavaScript automatically [converts an object to a string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#string_coercion) in a string context, such as when concatenating it with a string using `+` or embedding it in a template literal using `${}`.
13
- The default `toString()` method of objects returns `"[object Object]"`, which is often not what was intended.
13
+ The default `toString()` method of objects uses the format `"[object Object]"`, which is often not what was intended.
14
14
  This rule reports on values used in a template literal string that aren't strings, optionally allowing other data types that provide useful stringification results.
15
15
 
16
16
  :::note
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: 'Enforce consistent returning of awaited values.'
2
+ description: 'Enforce consistent awaiting of returned promises.'
3
3
  ---
4
4
 
5
5
  import Tabs from '@theme/Tabs';
@@ -9,12 +9,14 @@ import TabItem from '@theme/TabItem';
9
9
  >
10
10
  > See **https://typescript-eslint.io/rules/return-await** for documentation.
11
11
 
12
- Returning an awaited promise can make sense for better stack trace information as well as for consistent error handling (returned promises will not be caught in an async function try/catch).
13
-
14
12
  This rule builds on top of the [`eslint/no-return-await`](https://eslint.org/docs/rules/no-return-await) rule.
15
13
  It expands upon the base rule to add support for optionally requiring `return await` in certain cases.
16
14
 
17
- The extended rule is named `return-await` instead of `no-return-await` because the extended rule can enforce the positive or the negative. Additionally, while the core rule is now deprecated, the extended rule is still useful in many contexts.
15
+ The extended rule is named `return-await` instead of `no-return-await` because the extended rule can enforce the positive or the negative. Additionally, while the core rule is now deprecated, the extended rule is still useful in many contexts:
16
+
17
+ - Returning an awaited promise [improves stack trace information](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await#improving_stack_trace).
18
+ - When the `return` statement is in `try...catch`, awaiting the promise also allows the promise's rejection to be caught instead of leaving the error to the caller.
19
+ - Contrary to popular belief, `return await promise;` is [at least as fast as directly returning the promise](https://github.com/tc39/proposal-faster-promise-adoption).
18
20
 
19
21
  ## Options
20
22
 
@@ -26,15 +28,16 @@ const defaultOptions: Options = 'in-try-catch';
26
28
 
27
29
  ### `in-try-catch`
28
30
 
29
- Requires that a returned promise must be `await`ed in `try-catch-finally` blocks, and disallows it elsewhere.
30
- Specifically:
31
+ In cases where returning an unawaited promise would cause unexpected error-handling control flow, the rule enforces that `await` must be used.
32
+ Otherwise, the rule enforces that `await` must _not_ be used.
31
33
 
32
- - if you `return` a promise within a `try`, then it must be `await`ed.
33
- - if you `return` a promise within a `catch`, and there **_is no_** `finally`, then it **_must not_** be `await`ed.
34
- - if you `return` a promise within a `catch`, and there **_is a_** `finally`, then it **_must_** be `await`ed.
35
- - if you `return` a promise within a `finally`, then it **_must not_** be `await`ed.
34
+ Listing the error-handling cases exhaustively:
36
35
 
37
- Examples of code with `in-try-catch`:
36
+ - if you `return` a promise within a `try`, then it must be `await`ed, since it will always be followed by a `catch` or `finally`.
37
+ - if you `return` a promise within a `catch`, and there is _no_ `finally`, then it must _not_ be `await`ed.
38
+ - if you `return` a promise within a `catch`, and there _is_ a `finally`, then it _must_ be `await`ed.
39
+ - if you `return` a promise within a `finally`, then it must not be `await`ed.
40
+ - if you `return` a promise between a `using` or `await using` declaration and the end of its scope, it must be `await`ed, since it behaves equivalently to code wrapped in a `try` block.
38
41
 
39
42
  <Tabs>
40
43
  <TabItem value="❌ Incorrect">
@@ -42,23 +45,34 @@ Examples of code with `in-try-catch`:
42
45
  ```ts option='"in-try-catch"'
43
46
  async function invalidInTryCatch1() {
44
47
  try {
45
- return Promise.resolve('try');
46
- } catch (e) {}
48
+ return Promise.reject('try');
49
+ } catch (e) {
50
+ // Doesn't execute due to missing await.
51
+ }
47
52
  }
48
53
 
49
54
  async function invalidInTryCatch2() {
50
55
  try {
51
56
  throw new Error('error');
52
57
  } catch (e) {
53
- return await Promise.resolve('catch');
58
+ // Unnecessary await; rejections here don't impact control flow.
59
+ return await Promise.reject('catch');
54
60
  }
55
61
  }
56
62
 
63
+ // Prints 'starting async work', 'cleanup', 'async work done'.
57
64
  async function invalidInTryCatch3() {
65
+ async function doAsyncWork(): Promise<void> {
66
+ console.log('starting async work');
67
+ await new Promise(resolve => setTimeout(resolve, 1000));
68
+ console.log('async work done');
69
+ }
70
+
58
71
  try {
59
72
  throw new Error('error');
60
73
  } catch (e) {
61
- return Promise.resolve('catch');
74
+ // Missing await.
75
+ return doAsyncWork();
62
76
  } finally {
63
77
  console.log('cleanup');
64
78
  }
@@ -70,7 +84,8 @@ async function invalidInTryCatch4() {
70
84
  } catch (e) {
71
85
  throw new Error('error2');
72
86
  } finally {
73
- return await Promise.resolve('finally');
87
+ // Unnecessary await; rejections here don't impact control flow.
88
+ return await Promise.reject('finally');
74
89
  }
75
90
  }
76
91
 
@@ -81,6 +96,11 @@ async function invalidInTryCatch5() {
81
96
  async function invalidInTryCatch6() {
82
97
  return await 'value';
83
98
  }
99
+
100
+ async function invalidInTryCatch7() {
101
+ using x = createDisposable();
102
+ return Promise.reject('using in scope');
103
+ }
84
104
  ```
85
105
 
86
106
  </TabItem>
@@ -89,23 +109,32 @@ async function invalidInTryCatch6() {
89
109
  ```ts option='"in-try-catch"'
90
110
  async function validInTryCatch1() {
91
111
  try {
92
- return await Promise.resolve('try');
93
- } catch (e) {}
112
+ return await Promise.reject('try');
113
+ } catch (e) {
114
+ // Executes as expected.
115
+ }
94
116
  }
95
117
 
96
118
  async function validInTryCatch2() {
97
119
  try {
98
120
  throw new Error('error');
99
121
  } catch (e) {
100
- return Promise.resolve('catch');
122
+ return Promise.reject('catch');
101
123
  }
102
124
  }
103
125
 
126
+ // Prints 'starting async work', 'async work done', 'cleanup'.
104
127
  async function validInTryCatch3() {
128
+ async function doAsyncWork(): Promise<void> {
129
+ console.log('starting async work');
130
+ await new Promise(resolve => setTimeout(resolve, 1000));
131
+ console.log('async work done');
132
+ }
133
+
105
134
  try {
106
135
  throw new Error('error');
107
136
  } catch (e) {
108
- return await Promise.resolve('catch');
137
+ return await doAsyncWork();
109
138
  } finally {
110
139
  console.log('cleanup');
111
140
  }
@@ -117,7 +146,7 @@ async function validInTryCatch4() {
117
146
  } catch (e) {
118
147
  throw new Error('error2');
119
148
  } finally {
120
- return Promise.resolve('finally');
149
+ return Promise.reject('finally');
121
150
  }
122
151
  }
123
152
 
@@ -128,6 +157,11 @@ async function validInTryCatch5() {
128
157
  async function validInTryCatch6() {
129
158
  return 'value';
130
159
  }
160
+
161
+ async function validInTryCatch7() {
162
+ using x = createDisposable();
163
+ return await Promise.reject('using in scope');
164
+ }
131
165
  ```
132
166
 
133
167
  </TabItem>
@@ -9,6 +9,12 @@ import TabItem from '@theme/TabItem';
9
9
  >
10
10
  > See **https://typescript-eslint.io/rules/sort-type-constituents** for documentation.
11
11
 
12
+ :::danger Deprecated
13
+ This rule has been deprecated in favor of the [`perfectionist/sort-intersection-types`](https://eslint-plugin-perfectionist.azat.io/rules/sort-intersection-types) and [`perfectionist/sort-union-types`](https://eslint-plugin-perfectionist.azat.io/rules/sort-union-types) rules.
14
+
15
+ See [Docs: Deprecate sort-type-constituents in favor of eslint-plugin-perfectionist](https://github.com/typescript-eslint/typescript-eslint/issues/8915) and [eslint-plugin: Feature freeze naming and sorting stylistic rules](https://github.com/typescript-eslint/typescript-eslint/issues/8792) for more information.
16
+ :::
17
+
12
18
  Sorting union (`|`) and intersection (`&`) types can help:
13
19
 
14
20
  - keep your codebase standardized
@@ -19,15 +25,6 @@ This rule reports on any types that aren't sorted alphabetically.
19
25
 
20
26
  > Types are sorted case-insensitively and treating numbers like a human would, falling back to character code sorting in case of ties.
21
27
 
22
- :::note
23
- This rule is _feature frozen_: it will no longer receive new features such as new options.
24
- It still will accept bug and documentation fixes for its existing area of features.
25
-
26
- Stylistic rules that enforce naming and/or sorting conventions tend to grow incomprehensibly complex as increasingly obscure features are requested.
27
- This rule has reached the limit of what is reasonable for the typescript-eslint project to maintain.
28
- See [eslint-plugin: Feature freeze naming and sorting stylistic rules](https://github.com/typescript-eslint/typescript-eslint/issues/8792) for more information.
29
- :::
30
-
31
28
  ## Examples
32
29
 
33
30
  <Tabs>
@@ -97,6 +94,29 @@ type T4 =
97
94
 
98
95
  ## Options
99
96
 
97
+ ### `caseSensitive`
98
+
99
+ Whether to sort using case sensitive string comparisons.
100
+
101
+ Examples of code with `{ "caseSensitive": true }`:
102
+
103
+ <Tabs>
104
+ <TabItem value="❌ Incorrect">
105
+
106
+ ```ts option='{ "caseSensitive": true }'
107
+ type T = 'DeletedAt' | 'DeleteForever';
108
+ ```
109
+
110
+ </TabItem>
111
+ <TabItem value="✅ Correct">
112
+
113
+ ```ts option='{ "caseSensitive": true }'
114
+ type T = 'DeleteForever' | 'DeletedAt';
115
+ ```
116
+
117
+ </TabItem>
118
+ </Tabs>
119
+
100
120
  ### `checkIntersections`
101
121
 
102
122
  Whether to check intersection types (`&`).