Skip to content

IIFEs incorrectly refine Maybe-values to Nothing #8381

@RReverser

Description

@RReverser

TypeScript Version:

nightly (1.9.0-dev.20160429)

Code

let maybeNumber: number | undefined;
(function () {
    maybeNumber = 1;
})();
if (maybeNumber !== undefined) {
    maybeNumber++;
}

Expected behavior:
Everything works without errors, maybeNumber preserves type of number | undefined and refines to number in the if block.

let maybeNumber: number | undefined;
// Control flow figured that: maybeNumber === undefined
(function () {
    maybeNumber = 1;
})(); // --> oops, unknown side effects
// Revert maybeNumber to initial `number | undefined` to cover all possibilities
if (maybeNumber) {
    // Control flow: can refine to `number` again here
    maybeNumber++;
}

Actual behavior:
Language service reports type nothing on maybeNumber after the call (even though it's number | undefined before the call), so statement inside of the if condition breaks.

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScript

Type

No type
No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions