Issue
I'm trying to learn TypeScript and here's the problem: I have exported the constant of ROUTES:
export const ROUTES: Array<string> = ["USD", "EUR", "PLN"];
And I want to create the Rate type. It should be the object with one or more keys that are in the ROUTES array.
const rate : Rate = { // Error
USD: 1, // ALLOW
PLN: 2, // ALLOW
EUR: 12, // ALLOW
BTC: 2222 // DENY
}
OR
const rate : Rate = { // No error
USD: 1, // ALLOW
EUR: 12 // ALLOW
}
What I've tried:
import { ROUTES } from "../constants";
type Rate = {
[K in typeof ROUTES[number]]: number
}
AND
import { ROUTES } from "../constants";
const allowedKeys1 = [...ROUTES] as const;
const allowedKeys2 = ["USD", "EUR", "PLN"] as const;
type Rate = {
[K in typeof allowedKeys[1 | 2][number]]: number
}
Notice that allowedKeys2 and allowedKeys2 are different and give diffenet effects. allowedKeys1 does nothing and allowedKeys2 forces to use all keys, but doesn't use imported array. Using directly ROUTES is the same as using allowedKeys1.
Solution
You seem to already know that as const plays a role here. Without as const, the information about specific array elements is lost at assignment.
Now you can use a simple partial Record type.
export const ROUTES = ["USD", "EUR", "PLN"] as const;
type Rate = Partial<Record<typeof ROUTES[number], number>>
Answered By - Tobias S.
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.