I'm trying to use the --strict
option on tsc
but I ran into the following "weird" case that I don't seem to understand.
If I write:
function testStrict(input: {query?: {[prop: string]: string}}) { if (input.query) { Object.keys(input.query).forEach(key => { input.query[key]; }) } return input; }
the compiler complains about:
test.ts(5,9): error TS2532: Object is possibly 'undefined'.
(the offending line is input.query[key];
)
What I don't understand is, I have already checked for undefined with the if guard on the first line of the function if (input.query)
, so why does the compiler think it could possibly be undefined?
I fixed this by adding another identical guard before the object access, like:
function testStrict(input: {query?: {[prop: string]: string}}) { if (input.query) { Object.keys(input.query).forEach(key => { if (input.query) { input.query[key]; } }) } return input; }
but I don't understand why another identical line would be required.
The "Object is possibly 'undefined'" error occurs when we try to access a property on an object that may have a value of undefined . To solve the error, use the optional chaining operator or a type guard to make sure the reference is not undefined before accessing properties.
Another common way to avoid getting the "Object is possibly null or undefined " error is to use the logical AND (&&) operator. Copied!
Because the second access to input.query
happens inside another function the arrow function passed in to forEach
. Flow analysis does not cross function boundaries, so since you are in another function you need to test again.
An alternative to the double test would be to use a local variable, since the type of the variable is locked in on assignment and it will not include the undefined
type :
function testStrict(input: { query?: { [prop: string]: string } }) { if (input.query) { const query = input.query; Object.keys(input.query).forEach(key => { query[key]; }) } return input; }
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