How can I use extends on a variable? I want to enforce typing on it, without overriding it's inferred type.
Ideally:
const permissions extends {[K: string]: {guest: boolean, user: boolean, admin: boolean}} = {
readMessage: {guest: true, user: true, admin: true},
writeMessage: {guest: false, user: true, admin: true},
deleteMessage: {guest: false, user: false, admin: true},
};
type Permissions = keyof typeof permissions;
// Permissions = 'readMessage' | 'writeMessage' | 'deleteMessage'
The problem with using a type, is that it's overrides the type inference, so:
const permissions: {[K: string]: {/* ... */}} = {/* ... */};
type Permissions = keyof typeof permissions;
// Permissions = string
The only way I could think of, is wrapping the variable with an empty generic function:
const PermissionExtends = <T extends {[K: string]: {/* ... */}}>(v: T) => v;
const permissions = PermissionExtends({/* ... */});
type Permissions = keyof typeof permissions;
// Permissions = 'readMessage' | 'writeMessage' | 'deleteMessage'