diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 82fc1f490a4f4..c287e58aebfb7 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -37599,6 +37599,7 @@ namespace ts { (condExpr.operatorToken.kind === SyntaxKind.BarBarToken || condExpr.operatorToken.kind === SyntaxKind.AmpersandAmpersandToken) ? condExpr.right : condExpr; + if (isModuleExportsAccessExpression(location)) return; const type = checkTruthinessExpression(location); const isPropertyExpressionCast = isPropertyAccessExpression(location) && isTypeAssertion(location.expression); if (getFalsyFlags(type) || isPropertyExpressionCast) return; diff --git a/tests/baselines/reference/truthinessCallExpressionCoercion4.symbols b/tests/baselines/reference/truthinessCallExpressionCoercion4.symbols new file mode 100644 index 0000000000000..da41aefd1a344 --- /dev/null +++ b/tests/baselines/reference/truthinessCallExpressionCoercion4.symbols @@ -0,0 +1,17 @@ +=== tests/cases/compiler/a.js === +function fn() {} +>fn : Symbol(fn, Decl(a.js, 0, 0)) + +if (typeof module === 'object' && module.exports) { +>module : Symbol(module, Decl(a.js, 2, 51)) +>module.exports : Symbol(module.exports, Decl(a.js, 0, 0)) +>module : Symbol(module, Decl(a.js, 2, 51)) +>exports : Symbol(module.exports, Decl(a.js, 0, 0)) + + module.exports = fn; +>module.exports : Symbol(module.exports, Decl(a.js, 0, 0)) +>module : Symbol(export=, Decl(a.js, 2, 51)) +>exports : Symbol(export=, Decl(a.js, 2, 51)) +>fn : Symbol(fn, Decl(a.js, 0, 0)) +} + diff --git a/tests/baselines/reference/truthinessCallExpressionCoercion4.types b/tests/baselines/reference/truthinessCallExpressionCoercion4.types new file mode 100644 index 0000000000000..d9a0f16b91238 --- /dev/null +++ b/tests/baselines/reference/truthinessCallExpressionCoercion4.types @@ -0,0 +1,22 @@ +=== tests/cases/compiler/a.js === +function fn() {} +>fn : () => void + +if (typeof module === 'object' && module.exports) { +>typeof module === 'object' && module.exports : false | (() => void) +>typeof module === 'object' : boolean +>typeof module : "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" +>module : { exports: () => void; } +>'object' : "object" +>module.exports : () => void +>module : { exports: () => void; } +>exports : () => void + + module.exports = fn; +>module.exports = fn : () => void +>module.exports : () => void +>module : { exports: () => void; } +>exports : () => void +>fn : () => void +} + diff --git a/tests/cases/compiler/truthinessCallExpressionCoercion4.ts b/tests/cases/compiler/truthinessCallExpressionCoercion4.ts new file mode 100644 index 0000000000000..f585d7b78d18c --- /dev/null +++ b/tests/cases/compiler/truthinessCallExpressionCoercion4.ts @@ -0,0 +1,11 @@ +// @checkJs: true +// @allowJs: true +// @strict: true +// @noEmit: true +// @filename: a.js + +function fn() {} + +if (typeof module === 'object' && module.exports) { + module.exports = fn; +}