Skip to content

Commit 3b3cafd

Browse files
committed
fix(no-unsafe-references): Ignore TypeScript type references
Fixes #214
1 parent afa013f commit 3b3cafd

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

src/rules/no-unsafe-references.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { AST, Rule, Scope } from 'eslint';
22
import * as ESTree from 'estree';
3-
import { getStringValue, isFunction, isPageMethod } from '../utils/ast';
3+
import {
4+
getParent,
5+
getStringValue,
6+
isFunction,
7+
isPageMethod,
8+
} from '../utils/ast';
49
import { truthy } from '../utils/misc';
510

611
/** Collect all variable references in the parent scopes recursively. */
@@ -101,6 +106,10 @@ export default {
101106
// If a variable is used in the function, but not declared in the parent,
102107
// then it's likely a global variable such as `Promise` or `console`.
103108
through
109+
.filter((ref) => {
110+
const parent = getParent(ref.identifier);
111+
return (parent?.type as string) !== 'TSTypeReference';
112+
})
104113
.filter((ref) => allRefs.has(ref.identifier.name))
105114
.forEach((ref, i, arr) => {
106115
const descriptor: Rule.ReportDescriptor = {

src/utils/ast.ts

+4
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ export function isDescribeCall(node: ESTree.Node): boolean {
101101
: false;
102102
}
103103

104+
export function getParent(node: ESTree.Node): ESTree.Node | undefined {
105+
return (node as any).parent;
106+
}
107+
104108
export function findParent<T extends ESTree.Node['type']>(
105109
node: NodeWithParent,
106110
type: T,

test/spec/no-unsafe-references.spec.ts

+34
Original file line numberDiff line numberDiff line change
@@ -316,5 +316,39 @@ runRuleTester('no-unsafe-references', rule, {
316316
`,
317317
name: 'Multi-level scopes',
318318
},
319+
// TypeScript
320+
{
321+
code: dedent`
322+
type X = number;
323+
const result = await page.evaluate(() => {
324+
const x = 10 as X;
325+
return Promise.resolve(x);
326+
});
327+
`,
328+
name: 'TypeScript - variable assignment of type',
329+
parser: require.resolve('@typescript-eslint/parser'),
330+
},
331+
{
332+
code: dedent`
333+
type X = number;
334+
const result = await page.evaluate(() => {
335+
const foo = (bar: X) => bar;
336+
return Promise.resolve(foo(10));
337+
});
338+
`,
339+
name: 'TypeScript - parameter type',
340+
parser: require.resolve('@typescript-eslint/parser'),
341+
},
342+
{
343+
code: dedent`
344+
type X = number;
345+
const result = await page.evaluate(() => {
346+
const x: X = 10;
347+
return Promise.resolve(x);
348+
});
349+
`,
350+
name: 'TypeScript - casting',
351+
parser: require.resolve('@typescript-eslint/parser'),
352+
},
319353
],
320354
});

0 commit comments

Comments
 (0)