diff --git a/packages/eslint-plugin/src/rules/no-misused-promises.ts b/packages/eslint-plugin/src/rules/no-misused-promises.ts index b791fe15058..74f0690a517 100644 --- a/packages/eslint-plugin/src/rules/no-misused-promises.ts +++ b/packages/eslint-plugin/src/rules/no-misused-promises.ts @@ -502,10 +502,10 @@ export default createRule({ if (objType == null) { return; } - const propertySymbol = checker.getPropertyOfType( - objType, - tsNode.name.text, - ); + const propertySymbol = tsutils + .unionConstituents(objType) + .map(t => checker.getPropertyOfType(t, tsNode.name.getText())) + .find(p => p); if (propertySymbol == null) { return; } diff --git a/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts b/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts index dc671e8869d..fd908d416c0 100644 --- a/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts +++ b/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts @@ -2653,5 +2653,22 @@ const obj: O = { }, ], }, + { + code: ` +type A = { f: () => void } | undefined; +const a: A = { + async f() {}, +}; + `, + errors: [ + { + column: 3, + endColumn: 10, + endLine: 4, + line: 4, + messageId: 'voidReturnProperty', + }, + ], + }, ], });