Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit a3885be

Browse files
Use Record for objec types with a single indexer (#244)
1 parent 4464e9e commit a3885be

File tree

8 files changed

+40
-18
lines changed

8 files changed

+40
-18
lines changed

src/transform.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,8 @@ const transform = {
817817
if (
818818
t.isTSSymbolKeyword(key) ||
819819
t.isTSStringKeyword(key) ||
820-
t.isTSNumberKeyword(key)
820+
t.isTSNumberKeyword(key) ||
821+
t.isTSTypeReference(key)
821822
) {
822823
elements.push(indexer);
823824
} else {
@@ -835,6 +836,37 @@ const transform = {
835836
}
836837
});
837838

839+
// If there's only one property and it's an indexer convert the object
840+
// type to use Record, e.g.
841+
// {[string]: number} -> Record<string, number>
842+
if (
843+
spreads.length === 0 &&
844+
elements.length === 1 &&
845+
indexers.length === 1
846+
) {
847+
const indexer = indexers[0];
848+
const value = indexer.typeAnnotation.typeAnnotation;
849+
const key = indexer.parameters[0].typeAnnotation.typeAnnotation;
850+
851+
const record = t.tsTypeReference(
852+
t.identifier("Record"),
853+
t.tsTypeParameterInstantiation([key, value])
854+
);
855+
856+
if (indexer.readonly) {
857+
path.replaceWith(
858+
t.tsTypeReference(
859+
t.identifier("Readonly"),
860+
t.tsTypeParameterInstantiation([record])
861+
)
862+
);
863+
} else {
864+
path.replaceWith(record);
865+
}
866+
867+
return;
868+
}
869+
838870
if (spreads.length > 0 && elements.length > 0) {
839871
path.replaceWith(
840872
t.tsIntersectionType([...spreads, t.tsTypeLiteral(elements)])
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
let a: {
2-
[key: string]: any;
3-
};
1+
let a: Record<string, any>;
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
let obj: {
2-
[key: number]: string;
3-
};
1+
let obj: Record<number, string>;
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
let obj: {
2-
[key: number]: string;
3-
};
1+
let obj: Record<number, string>;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
type Key = "foo" | "bar";
2-
let obj: { [key in Key]?: string };
2+
let obj: Record<Key, string>;
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
let obj: {
2-
readonly [key: number]: string;
3-
};
1+
let obj: Readonly<Record<number, string>>;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
let obj: { [key in A]?: string };
1+
let obj: Record<A, string>;
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
let obj: {
2-
[key: number]: string;
3-
};
1+
let obj: Record<number, string>;

0 commit comments

Comments
 (0)