From 189162d46ecb116c420232937a7f86df913f4e79 Mon Sep 17 00:00:00 2001 From: Brad Zacher Date: Sun, 13 Sep 2020 12:27:01 -0700 Subject: [PATCH] fix(eslint-plugin): [no-use-before-define] false positive for function type arguments (#2554) Fixes #2527 --- packages/eslint-plugin/src/rules/no-use-before-define.ts | 3 ++- .../eslint-plugin/tests/rules/no-use-before-define.test.ts | 4 ++++ packages/experimental-utils/src/ts-eslint/Scope.ts | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/no-use-before-define.ts b/packages/eslint-plugin/src/rules/no-use-before-define.ts index 1e26e4729f9..18525a138ce 100644 --- a/packages/eslint-plugin/src/rules/no-use-before-define.ts +++ b/packages/eslint-plugin/src/rules/no-use-before-define.ts @@ -260,7 +260,8 @@ export default util.createRule({ variable.identifiers.length === 0 || (variable.identifiers[0].range[1] <= reference.identifier.range[1] && !isInInitializer(variable, reference)) || - !isForbidden(variable, reference) + !isForbidden(variable, reference) || + reference.from.type === TSESLint.Scope.ScopeType.functionType ) { return; } diff --git a/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts b/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts index 85dec218d11..ad66ff7858e 100644 --- a/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts +++ b/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts @@ -343,6 +343,10 @@ const React = require('react'); }, }, }, + // https://github.com/typescript-eslint/typescript-eslint/issues/2527 + ` +type T = (value: unknown) => value is Id; + `, ], invalid: [ { diff --git a/packages/experimental-utils/src/ts-eslint/Scope.ts b/packages/experimental-utils/src/ts-eslint/Scope.ts index 2a7f707a429..2934a4d2756 100644 --- a/packages/experimental-utils/src/ts-eslint/Scope.ts +++ b/packages/experimental-utils/src/ts-eslint/Scope.ts @@ -46,9 +46,11 @@ namespace Scope { export type Reference = scopeManager.Reference; export type Variable = scopeManager.Variable | ESLintScopeVariable; export type Scope = scopeManager.Scope; + export const ScopeType = scopeManager.ScopeType; // TODO - in the next major, clean this up with a breaking change export type DefinitionType = scopeManager.Definition; export type Definition = scopeManager.Definition; + export const DefinitionType = scopeManager.DefinitionType; } export { Scope };