Reputation: 100020
I have this input in a .ts file:
export const OverSizedItems = <{ [key: string]: OverSizedItemType }>{
NONE: {
factor: 1,
count: 0,
mooversNeeded: 1,
},
ONE: {
factor: 1.01,
count: 1,
mooversNeeded: 4,
},
TWO: {
factor: 1.03,
count: 2,
mooversNeeded: 4,
},
THREE_PLUS: {
factor: 1.07,
count: 5,
mooversNeeded: 6,
}
};
it transpiles to this:
export declare const OverSizedItems: {
[key: string]: OverSizedItemType;
};
but if change the original, and leave off the index signature type info, I get this, which is more what I am looking for:
export declare const OverSizedItems: {
NONE: {
factor: number;
count: number;
mooversNeeded: number;
};
ONE: {
factor: number;
count: number;
mooversNeeded: number;
};
TWO: {
factor: number;
count: number;
mooversNeeded: number;
};
THREE_PLUS: {
factor: number;
count: number;
mooversNeeded: number;
};
};
an enum won't work here because enum's cannot point to objects.
So what can I do to add the index signature but keep all the values?
Upvotes: 0
Views: 37
Reputation: 12018
The best I could come up with is to use the Record
type, with all of the keys written out in a union, like so:
type OverSizedItemKey = "NONE" | "ONE" | "TWO" | "THREE_PLUS"
export const OversizedItems: Record<OverSizedItemKey, OverSizedItemType> = {
// ...
}
Record
uses a mapped type, so make sure you're familiar with that to know how/why this works.
Upvotes: 1