Object shapes
Record
Builds an object type from a key set and one value type.
What it is
The constructor to `Pick`’s selector. Given a union of keys and a value type it produces the object with those keys, and given `string` it produces an index signature instead. Those two behaviours look similar and are not: one is a fixed shape and the other is a dictionary.
Examples
Record<'a' | 'b', number>
→{ a: number; b: number; }Record<string, number>
→{ [x: string]: number; }An index signature, not a fixed shape — every key is allowed and none is guaranteed.
Record<'id', string>
→{ id: string; }
Each resolved type above was printed by TypeScript 5.9.3, not written by hand.
What it does not do
- It does not promise the keys exist at run time. `Record<string, number>` will happily let you read a key that was never set, and hand you `number` for it.
- It does not vary the value per key. When each key needs its own value type, you want a mapped type with `as`, not `Record`.
Takeaway
A literal union of keys gives you a shape the compiler will check. `string` gives you a dictionary it cannot. Choose deliberately.