Skip to content

Commit 72d16e3

Browse files
authored
fix: avoid false positive in no-unassigned-vars for declare module (#19746)
* fix: avoid false positive in `no-unassigned-vars` for declare module * docs: add declare module example in `no-unassigned-vars` rule * perf: use flag instead of `getAncestors` in `no-unassigned-vars rule` * test: add flag reset test for `no-unassigned-vars`
1 parent f4fa40e commit 72d16e3

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

docs/src/rules/no-unassigned-vars.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ In TypeScript:
129129

130130
declare let value: number | undefined;
131131
console.log(value);
132+
133+
declare module "my-module" {
134+
let value: string;
135+
export = value;
136+
}
132137
```
133138
134139
:::

lib/rules/no-unassigned-vars.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,25 @@ module.exports = {
3131

3232
create(context) {
3333
const sourceCode = context.sourceCode;
34+
let insideDeclareModule = false;
3435

3536
return {
37+
"TSModuleDeclaration[declare=true]"() {
38+
insideDeclareModule = true;
39+
},
40+
"TSModuleDeclaration[declare=true]:exit"() {
41+
insideDeclareModule = false;
42+
},
3643
VariableDeclarator(node) {
3744
/** @type {import('estree').VariableDeclaration} */
3845
const declaration = node.parent;
39-
const shouldCheck =
40-
!node.init &&
41-
node.id.type === "Identifier" &&
42-
declaration.kind !== "const" &&
43-
!declaration.declare;
44-
if (!shouldCheck) {
46+
const shouldSkip =
47+
node.init ||
48+
node.id.type !== "Identifier" ||
49+
declaration.kind === "const" ||
50+
declaration.declare ||
51+
insideDeclareModule;
52+
if (shouldSkip) {
4553
return;
4654
}
4755
const [variable] = sourceCode.getDeclaredVariables(node);

tests/lib/rules/no-unassigned-vars.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,13 @@ ruleTesterTypeScript.run("no-unassigned-vars", rule, {
140140
}
141141
}
142142
`,
143+
unIndent`
144+
declare module 'module' {
145+
import type { T } from 'module';
146+
let x: T;
147+
export = x;
148+
}
149+
`,
143150
],
144151
invalid: [
145152
{
@@ -175,5 +182,22 @@ ruleTesterTypeScript.run("no-unassigned-vars", rule, {
175182
},
176183
],
177184
},
185+
{
186+
code: unIndent`
187+
declare module 'module' {
188+
let x: string;
189+
}
190+
let y: string;
191+
console.log(y);
192+
`,
193+
errors: [
194+
{
195+
messageId: "unassigned",
196+
line: 4,
197+
column: 9,
198+
data: { name: "y" },
199+
},
200+
],
201+
},
178202
],
179203
});

0 commit comments

Comments
 (0)