I have the following code:
export const mapLayers: Record<string, SomeObject> = {
layer_a: {},
layer_b: {}
} as const;
export type LayerId = keyof typeof mapLayers;
LayerId will always be string and not layer_a | layer_b which I would expect.
It actually does work if I remove the Record<string, SomeObject> part. But then I lose the possiblity to limit what's in mapLayers values. How can I get proper inferred keys AND also the "limited" values?
Sounds like a case for the
satisifesoperator:This tells typescript that it should infer the type strictly (similar to
as const, without making propertiesreadonly). In addition though, it tells typescript you want an error to happen if the result is incompatible withRecord<string, SomeObject>For more on
satisfies, see this documentation page