@@ -140,6 +140,19 @@ type Foo = Record<string, any>;
140
140
errors : [ { messageId : 'preferRecord' , line : 2 , column : 1 } ] ,
141
141
} ,
142
142
143
+ // Readonly interface
144
+ {
145
+ code : `
146
+ interface Foo {
147
+ readonly [key: string]: any;
148
+ }
149
+ ` ,
150
+ output : `
151
+ type Foo = Readonly<Record<string, any>>;
152
+ ` ,
153
+ errors : [ { messageId : 'preferRecord' , line : 2 , column : 1 } ] ,
154
+ } ,
155
+
143
156
// Interface with generic parameter
144
157
{
145
158
code : `
@@ -153,6 +166,19 @@ type Foo<A> = Record<string, A>;
153
166
errors : [ { messageId : 'preferRecord' , line : 2 , column : 1 } ] ,
154
167
} ,
155
168
169
+ // Readonly interface with generic parameter
170
+ {
171
+ code : `
172
+ interface Foo<A> {
173
+ readonly [key: string]: A;
174
+ }
175
+ ` ,
176
+ output : `
177
+ type Foo<A> = Readonly<Record<string, A>>;
178
+ ` ,
179
+ errors : [ { messageId : 'preferRecord' , line : 2 , column : 1 } ] ,
180
+ } ,
181
+
156
182
// Interface with multiple generic parameters
157
183
{
158
184
code : `
@@ -166,20 +192,47 @@ type Foo<A, B> = Record<A, B>;
166
192
errors : [ { messageId : 'preferRecord' , line : 2 , column : 1 } ] ,
167
193
} ,
168
194
195
+ // Readonly interface with multiple generic parameters
196
+ {
197
+ code : `
198
+ interface Foo<A, B> {
199
+ readonly [key: A]: B;
200
+ }
201
+ ` ,
202
+ output : `
203
+ type Foo<A, B> = Readonly<Record<A, B>>;
204
+ ` ,
205
+ errors : [ { messageId : 'preferRecord' , line : 2 , column : 1 } ] ,
206
+ } ,
207
+
169
208
// Type literal
170
209
{
171
210
code : 'type Foo = { [key: string]: any };' ,
172
211
output : 'type Foo = Record<string, any>;' ,
173
212
errors : [ { messageId : 'preferRecord' , line : 1 , column : 12 } ] ,
174
213
} ,
175
214
215
+ // Readonly type literal
216
+ {
217
+ code : 'type Foo = { readonly [key: string]: any };' ,
218
+ output : 'type Foo = Readonly<Record<string, any>>;' ,
219
+ errors : [ { messageId : 'preferRecord' , line : 1 , column : 12 } ] ,
220
+ } ,
221
+
176
222
// Generic
177
223
{
178
224
code : 'type Foo = Generic<{ [key: string]: any }>;' ,
179
225
output : 'type Foo = Generic<Record<string, any>>;' ,
180
226
errors : [ { messageId : 'preferRecord' , line : 1 , column : 20 } ] ,
181
227
} ,
182
228
229
+ // Readonly Generic
230
+ {
231
+ code : 'type Foo = Generic<{ readonly [key: string]: any }>;' ,
232
+ output : 'type Foo = Generic<Readonly<Record<string, any>>>;' ,
233
+ errors : [ { messageId : 'preferRecord' , line : 1 , column : 20 } ] ,
234
+ } ,
235
+
183
236
// Function types
184
237
{
185
238
code : 'function foo(arg: { [key: string]: any }) {}' ,
@@ -192,6 +245,18 @@ type Foo<A, B> = Record<A, B>;
192
245
errors : [ { messageId : 'preferRecord' , line : 1 , column : 17 } ] ,
193
246
} ,
194
247
248
+ // Readonly function types
249
+ {
250
+ code : 'function foo(arg: { readonly [key: string]: any }) {}' ,
251
+ output : 'function foo(arg: Readonly<Record<string, any>>) {}' ,
252
+ errors : [ { messageId : 'preferRecord' , line : 1 , column : 19 } ] ,
253
+ } ,
254
+ {
255
+ code : 'function foo(): { readonly [key: string]: any } {}' ,
256
+ output : 'function foo(): Readonly<Record<string, any>> {}' ,
257
+ errors : [ { messageId : 'preferRecord' , line : 1 , column : 17 } ] ,
258
+ } ,
259
+
195
260
// Never
196
261
// Type literal
197
262
{
0 commit comments