I want to define an interface with optional fields. I thought the following were synonymous.
(A):
interface State { userDetails: undefined | string | DataStructure | Error; } (B):
interface State { userDetails?: string | DataStructure | Error; } But when I go to initialise the state, (A) forces me to explicitly set the field as undefined, like so:
static readonly initialAppState: AppState = { userDetails: undefined }; But with (B) I can just omit the field completely:
static readonly initialAppState: AppState = { }; If I try to omit the field when using definition (A) Typescript will complain saying:
Property 'userDetails' is missing in type Why do I have to set the field explicitly when using definition (A)? What's the difference between the two definitions that forces this different requirement when initialising?
Typesript version: 2.3.4
Edit: If you found this question and the answer below interesting or relevant, you may want to know that TypeScript is changing in v4.4 to add the --exactOptionalPropertyTypes flag. This new flag will now cause an error on some of the original code that prompted me to ask this question.
Even at runtime there is a difference between a key with an undefined value and a key that doesn't exist. That TypeScript allows differentiating is not surprising.
Try this:
Object.keys({a: undefined}); If leaving a out and setting it's value to be undefined were the same thing then we'd expect the above to return an empty array, but in fact it returns
[ 'a' ]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With