diff --git a/packages/eslint-plugin/src/rules/unbound-method.ts b/packages/eslint-plugin/src/rules/unbound-method.ts index fde58dc4e6f..c27f732ca34 100644 --- a/packages/eslint-plugin/src/rules/unbound-method.ts +++ b/packages/eslint-plugin/src/rules/unbound-method.ts @@ -241,7 +241,10 @@ function isSafeUse(node: TSESTree.Node): boolean { return parent.tag === node; case AST_NODE_TYPES.UnaryExpression: - return parent.operator === 'typeof'; + // the first case is safe for obvious + // reasons. The second one is also fine + // since we're returning something falsy + return ['typeof', '!', 'void', 'delete'].includes(parent.operator); case AST_NODE_TYPES.BinaryExpression: return ['instanceof', '==', '!=', '===', '!=='].includes(parent.operator); diff --git a/packages/eslint-plugin/tests/rules/unbound-method.test.ts b/packages/eslint-plugin/tests/rules/unbound-method.test.ts index df1d50ac136..20caa1d8b45 100644 --- a/packages/eslint-plugin/tests/rules/unbound-method.test.ts +++ b/packages/eslint-plugin/tests/rules/unbound-method.test.ts @@ -150,6 +150,9 @@ ruleTester.run('unbound-method', rule, { 'instance.unbound = () => {};', 'instance.unbound = instance.unbound.bind(instance);', + 'if (!!instance.unbound) {}', + 'void instance.unbound', + 'delete instance.unbound', ].map(addContainsMethodsClass), ` interface RecordA {