Skip to content

IIFEs incorrectly refine Maybe-values to Nothing #8381

Closed
@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

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions