diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index cfad47b65336f..14fcd2eea465b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -18027,7 +18027,7 @@ namespace ts { // the entire control flow graph from the variable's declaration (i.e. when the flow container and // declaration container are the same). const assumeInitialized = isParameter || isAlias || isOuterVariable || isSpreadDestructuringAssignmentTarget || isModuleExports || isBindingElement(declaration) || - type !== autoType && type !== autoArrayType && (!strictNullChecks || (type.flags & TypeFlags.AnyOrUnknown) !== 0 || + type !== autoType && type !== autoArrayType && (!strictNullChecks || (type.flags & (TypeFlags.AnyOrUnknown | TypeFlags.Void)) !== 0 || isInTypeQuery(node) || node.parent.kind === SyntaxKind.ExportSpecifier) || node.parent.kind === SyntaxKind.NonNullExpression || declaration.kind === SyntaxKind.VariableDeclaration && (declaration).exclamationToken || diff --git a/tests/baselines/reference/logicalAndOperatorStrictMode.types b/tests/baselines/reference/logicalAndOperatorStrictMode.types index 2d7ef648aeeac..6bf592c8b7b31 100644 --- a/tests/baselines/reference/logicalAndOperatorStrictMode.types +++ b/tests/baselines/reference/logicalAndOperatorStrictMode.types @@ -256,7 +256,7 @@ const v5 = v && v; >v5 : void >v && v : void >v : void ->v : never +>v : void const v6 = v && u; >v6 : void diff --git a/tests/baselines/reference/voidIsInitialized.js b/tests/baselines/reference/voidIsInitialized.js new file mode 100644 index 0000000000000..4aaa550d44fb5 --- /dev/null +++ b/tests/baselines/reference/voidIsInitialized.js @@ -0,0 +1,23 @@ +//// [voidIsInitialized.ts] +const x: void = undefined; +const y: void = undefined; + +if(typeof x === "undefined") { + x // no error: assume x2 is initialised +} + +if(typeof y !== "undefined") { + y // no error: do not narrow void +} + + +//// [voidIsInitialized.js] +"use strict"; +var x = undefined; +var y = undefined; +if (typeof x === "undefined") { + x; // no error: assume x2 is initialised +} +if (typeof y !== "undefined") { + y; // no error: do not narrow void +} diff --git a/tests/baselines/reference/voidIsInitialized.symbols b/tests/baselines/reference/voidIsInitialized.symbols new file mode 100644 index 0000000000000..23ce56b309f85 --- /dev/null +++ b/tests/baselines/reference/voidIsInitialized.symbols @@ -0,0 +1,23 @@ +=== tests/cases/compiler/voidIsInitialized.ts === +const x: void = undefined; +>x : Symbol(x, Decl(voidIsInitialized.ts, 0, 5)) +>undefined : Symbol(undefined) + +const y: void = undefined; +>y : Symbol(y, Decl(voidIsInitialized.ts, 1, 5)) +>undefined : Symbol(undefined) + +if(typeof x === "undefined") { +>x : Symbol(x, Decl(voidIsInitialized.ts, 0, 5)) + + x // no error: assume x2 is initialised +>x : Symbol(x, Decl(voidIsInitialized.ts, 0, 5)) +} + +if(typeof y !== "undefined") { +>y : Symbol(y, Decl(voidIsInitialized.ts, 1, 5)) + + y // no error: do not narrow void +>y : Symbol(y, Decl(voidIsInitialized.ts, 1, 5)) +} + diff --git a/tests/baselines/reference/voidIsInitialized.types b/tests/baselines/reference/voidIsInitialized.types new file mode 100644 index 0000000000000..a8b5767d2c47b --- /dev/null +++ b/tests/baselines/reference/voidIsInitialized.types @@ -0,0 +1,29 @@ +=== tests/cases/compiler/voidIsInitialized.ts === +const x: void = undefined; +>x : void +>undefined : undefined + +const y: void = undefined; +>y : void +>undefined : undefined + +if(typeof x === "undefined") { +>typeof x === "undefined" : boolean +>typeof x : "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" +>x : void +>"undefined" : "undefined" + + x // no error: assume x2 is initialised +>x : void +} + +if(typeof y !== "undefined") { +>typeof y !== "undefined" : boolean +>typeof y : "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" +>y : void +>"undefined" : "undefined" + + y // no error: do not narrow void +>y : void +} + diff --git a/tests/cases/compiler/voidIsInitialized.ts b/tests/cases/compiler/voidIsInitialized.ts new file mode 100644 index 0000000000000..b2027c21df3b5 --- /dev/null +++ b/tests/cases/compiler/voidIsInitialized.ts @@ -0,0 +1,12 @@ +// @strict: true + +const x: void = undefined; +const y: void = undefined; + +if(typeof x === "undefined") { + x // no error: assume x2 is initialised +} + +if(typeof y !== "undefined") { + y // no error: do not narrow void +}