Max101
Max101

Reputation: 600

Typescript type for custom Record keys

I am trying to write a small library where I want to add type safety to the following object:

export const ErrorCodeMap: Record<string, [string, number]> = {
  NOT_FOUND: ['1001', 222],
  ALREADY_EXISTS: ['1002', 111],
}

Now what I want to do is to get a type-safe list of the keys of the object ErrorCodeMap.

If I do the following

export type ErrorCode = keyof typeof ErrorCodeMap;

the type of ErrorCode is equal to string. I would like it to equal 'NOT_FOUND' | 'ALREADY_EXISTS'.

I tried to use the as const syntax but I think I am a bit off here.

Is there any way to solve this WITHOUT removing the Record<string, [string, number]> definition and thus retaining type safety on the object definition?

Upvotes: 4

Views: 690

Answers (1)

cefn
cefn

Reputation: 3341

This approach gives you a suitable type...

export const ERROR_MAP = {
  NOT_FOUND: ['1001', 222],
  ALREADY_EXISTS: ['1002', 111],
} as const satisfies Record<string, readonly [string, number]>

// hover to reveal type ErrorCode = "NOT_FOUND" | "ALREADY_EXISTS"
type ErrorCode = keyof typeof ERROR_MAP;

Typescript Playground

Upvotes: 4

Related Questions