Skip to content

Commit 22d5440

Browse files
golopotljharb
authored andcommitted
[fix] export: false positive for typescript overloads
Fixes #1357.
1 parent 5abd5ed commit 22d5440

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

src/rules/export.js

+17
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,21 @@ ambient namespaces:
2424
const rootProgram = 'root'
2525
const tsTypePrefix = 'type:'
2626

27+
/**
28+
* Detect function overloads like:
29+
* ```ts
30+
* export function foo(a: number);
31+
* export function foo(a: string);
32+
* export function foo(a: number|string) { return a; }
33+
* ```
34+
* @param {Set<Object>} nodes
35+
* @returns {boolean}
36+
*/
37+
function isTypescriptFunctionOverloads(nodes) {
38+
const types = new Set(Array.from(nodes, node => node.parent.type))
39+
return types.size === 2 && types.has('TSDeclareFunction') && types.has('FunctionDeclaration')
40+
}
41+
2742
module.exports = {
2843
meta: {
2944
type: 'problem',
@@ -123,6 +138,8 @@ module.exports = {
123138
for (let [name, nodes] of named) {
124139
if (nodes.size <= 1) continue
125140

141+
if (isTypescriptFunctionOverloads(nodes)) continue
142+
126143
for (let node of nodes) {
127144
if (name === 'default') {
128145
context.report(node, 'Multiple default exports.')

tests/src/rules/export.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ context('Typescript', function () {
118118
parsers.push(require.resolve('@typescript-eslint/parser'))
119119
}
120120

121-
if (semver.satisfies(eslintPkg.version, '<6.0.0')) {
121+
if (semver.satisfies(eslintPkg.version, '>=4.0.0 <6.0.0')) {
122122
parsers.push(require.resolve('typescript-eslint-parser'))
123123
}
124124

@@ -147,6 +147,14 @@ context('Typescript', function () {
147147
`,
148148
}, parserConfig)),
149149

150+
test(Object.assign({
151+
code: `
152+
export function fff(a: string);
153+
export function fff(a: number);
154+
export function fff(a: string|number) {};
155+
`,
156+
}, parserConfig)),
157+
150158
// namespace
151159
test(Object.assign({
152160
code: `

0 commit comments

Comments
 (0)