@@ -8,7 +8,9 @@ type MessageIds =
8
8
| 'as'
9
9
| 'angle-bracket'
10
10
| 'never'
11
- | 'unexpectedObjectTypeAssertion' ;
11
+ | 'unexpectedObjectTypeAssertion'
12
+ | 'replaceObjectTypeAssertionWithAnnotation'
13
+ | 'replaceObjectTypeAssertionWithSatisfies' ;
12
14
type OptUnion =
13
15
| {
14
16
assertionStyle : 'as' | 'angle-bracket' ;
@@ -24,6 +26,7 @@ export default util.createRule<Options, MessageIds>({
24
26
meta : {
25
27
type : 'suggestion' ,
26
28
fixable : 'code' ,
29
+ hasSuggestions : true ,
27
30
docs : {
28
31
description : 'Enforce consistent usage of type assertions' ,
29
32
recommended : 'strict' ,
@@ -33,6 +36,10 @@ export default util.createRule<Options, MessageIds>({
33
36
'angle-bracket' : "Use '<{{cast}}>' instead of 'as {{cast}}'." ,
34
37
never : 'Do not use any type assertions.' ,
35
38
unexpectedObjectTypeAssertion : 'Always prefer const x: T = { ... }.' ,
39
+ replaceObjectTypeAssertionWithAnnotation :
40
+ 'Use const x: {{cast}} = { ... } instead.' ,
41
+ replaceObjectTypeAssertionWithSatisfies :
42
+ 'Use const x = { ... } satisfies {{cast}} instead.' ,
36
43
} ,
37
44
schema : [
38
45
{
@@ -184,9 +191,42 @@ export default util.createRule<Options, MessageIds>({
184
191
checkType ( node . typeAnnotation ) &&
185
192
node . expression . type === AST_NODE_TYPES . ObjectExpression
186
193
) {
194
+ const suggest : TSESLint . ReportSuggestionArray < MessageIds > = [ ] ;
195
+ if (
196
+ node . parent ?. type === AST_NODE_TYPES . VariableDeclarator &&
197
+ ! node . parent . id . typeAnnotation
198
+ ) {
199
+ const { parent } = node ;
200
+ suggest . push ( {
201
+ messageId : 'replaceObjectTypeAssertionWithAnnotation' ,
202
+ data : { cast : sourceCode . getText ( node . typeAnnotation ) } ,
203
+ fix : fixer => [
204
+ fixer . insertTextAfter (
205
+ parent . id ,
206
+ `: ${ sourceCode . getText ( node . typeAnnotation ) } ` ,
207
+ ) ,
208
+ fixer . replaceText ( node , getTextWithParentheses ( node . expression ) ) ,
209
+ ] ,
210
+ } ) ;
211
+ }
212
+ suggest . push ( {
213
+ messageId : 'replaceObjectTypeAssertionWithSatisfies' ,
214
+ data : { cast : sourceCode . getText ( node . typeAnnotation ) } ,
215
+ fix : fixer => [
216
+ fixer . replaceText ( node , getTextWithParentheses ( node . expression ) ) ,
217
+ fixer . insertTextAfter (
218
+ node ,
219
+ ` satisfies ${ context
220
+ . getSourceCode ( )
221
+ . getText ( node . typeAnnotation ) } `,
222
+ ) ,
223
+ ] ,
224
+ } ) ;
225
+
187
226
context . report ( {
188
227
node,
189
228
messageId : 'unexpectedObjectTypeAssertion' ,
229
+ suggest,
190
230
} ) ;
191
231
}
192
232
}
0 commit comments