I have a type, jsonReplyObject.
export type jsonReplyObject = {
commands?: {
'relogin'?: boolean
'throttled'?: boolean
},
success?: boolean,
message?: string,
};
And a function declaration like this
function foo(command: keyof jsonReplyObject['commands']) {}
When I try to call foo('relogin'), I get Argument of type 'string' is not assignable to parameter of type 'never'.
If I change the declaration of commands above from commands?: to commands:, it solves this error and keyof jsonReplyObject['commands'] works as I'd expect, enforcing that that argument is a possible key of commands. Unfortunately, it causes several other errors where instances of jsonReplyObject now require commands be provided.
What's the simplest way to fix this?
I've removed a lot of commands to keep this brief, but several commands are not of boolean type. They're of types relevant to their purpose.
CodePudding user response:
Use the NonNullable type :
function foo(command: keyof NonNullable<jsonReplyObject['commands']>) {}
CodePudding user response:
The built-in NonNullable utility type excludes null and undefined, so you can use keyof on that:
function foo(command: keyof NonNullable<jsonReplyObject['commands']>) {}
Previously, it gives you never because keyof undefined is never.
Another solution would be to use the built-in Required type:
function foo(command: keyof Required<jsonReplyObject>['commands']) {}
