diff --git a/packages/eslint-plugin/src/rules/unbound-method.ts b/packages/eslint-plugin/src/rules/unbound-method.ts index 46bbe779c66c..8e27874271cc 100644 --- a/packages/eslint-plugin/src/rules/unbound-method.ts +++ b/packages/eslint-plugin/src/rules/unbound-method.ts @@ -111,6 +111,9 @@ function isSafeUse(node: TSESTree.Node): boolean { case AST_NODE_TYPES.CallExpression: return parent.callee === node; + case AST_NODE_TYPES.AssignmentExpression: + return isBindCalled(parent.right); + case AST_NODE_TYPES.ConditionalExpression: return parent.test === node; @@ -134,3 +137,12 @@ function isSafeUse(node: TSESTree.Node): boolean { return false; } + +function isBindCalled(parent: TSESTree.Expression): boolean { + return ( + parent.type === AST_NODE_TYPES.CallExpression && + parent.callee.type === AST_NODE_TYPES.MemberExpression && + parent.callee.property.type === AST_NODE_TYPES.Identifier && + parent.callee.property.name === 'bind' + ); +} diff --git a/packages/eslint-plugin/tests/rules/unbound-method.test.ts b/packages/eslint-plugin/tests/rules/unbound-method.test.ts index 520b28fc1d1d..352b9ee9a283 100644 --- a/packages/eslint-plugin/tests/rules/unbound-method.test.ts +++ b/packages/eslint-plugin/tests/rules/unbound-method.test.ts @@ -143,6 +143,16 @@ class CommunicationError { class CommunicationError {} const x = CommunicationError.prototype; `, + // https://github.com/typescript-eslint/typescript-eslint/issues/700 + ` +class ContainsBoundMethod { + constructor() { + this.handleSomething = this.handleSomething.bind(this); + } + + handleSomething(): void {} +} + `, ], invalid: [ {