Alexander Mills
Alexander Mills

Reputation: 100020

TS creates .d.ts file that is less descriptive

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

Answers (1)

kingdaro
kingdaro

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

Related Questions