From 84916e6713d05ffccc208149b623c86004098435 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 1 Aug 2019 17:39:47 -0700 Subject: [PATCH] fix(eslint-plugin): [typedef] support default value for parameter (#785) --- packages/eslint-plugin/src/rules/typedef.ts | 19 ++++++-- .../eslint-plugin/tests/rules/typedef.test.ts | 46 ++++++++++++++++++- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/packages/eslint-plugin/src/rules/typedef.ts b/packages/eslint-plugin/src/rules/typedef.ts index 5e0465e0e23..e47ccad9522 100644 --- a/packages/eslint-plugin/src/rules/typedef.ts +++ b/packages/eslint-plugin/src/rules/typedef.ts @@ -69,10 +69,21 @@ export default util.createRule<[Options], MessageIds>({ function checkParameters(params: TSESTree.Parameter[]) { for (const param of params) { - if ( - param.type !== AST_NODE_TYPES.TSParameterProperty && - !param.typeAnnotation - ) { + let annotationNode: TSESTree.Node | undefined; + + switch (param.type) { + case AST_NODE_TYPES.AssignmentPattern: + annotationNode = param.left; + break; + case AST_NODE_TYPES.TSParameterProperty: + annotationNode = param.parameter; + break; + default: + annotationNode = param; + break; + } + + if (annotationNode !== undefined && !annotationNode.typeAnnotation) { report(param, getNodeName(param)); } } diff --git a/packages/eslint-plugin/tests/rules/typedef.test.ts b/packages/eslint-plugin/tests/rules/typedef.test.ts index 8c281fe5e39..49d98e2654f 100644 --- a/packages/eslint-plugin/tests/rules/typedef.test.ts +++ b/packages/eslint-plugin/tests/rules/typedef.test.ts @@ -101,13 +101,21 @@ ruleTester.run('typedef', rule, { }, ], }, - // Parameters + // Function parameters `function receivesNumber(a: number): void { }`, `function receivesStrings(a: string, b: string): void { }`, `function receivesNumber([a]: [number]): void { }`, `function receivesNumbers([a, b]: number[]): void { }`, `function receivesString({ a }: { a: string }): void { }`, `function receivesStrings({ a, b }: { [i: string ]: string }): void { }`, + `function receivesNumber(a: number = 123): void { }`, + // Method parameters + `class Test { + public method(x: number): number { return x; } + }`, + `class Test { + public method(x: number = 123): number { return x; } + }`, // Property declarations `type Test = { member: number; @@ -291,7 +299,7 @@ ruleTester.run('typedef', rule, { }, ], }, - // Parameters + // Function parameters { code: `function receivesNumber(a): void { }`, errors: [ @@ -350,6 +358,40 @@ ruleTester.run('typedef', rule, { }, ], }, + // Method parameters + { + code: `class Test { + public method(x): number { return x; } + }`, + errors: [ + { + column: 23, + messageId: 'expectedTypedefNamed', + }, + ], + }, + { + code: `class Test { + public method(x = 123): number { return x; } + }`, + errors: [ + { + column: 23, + messageId: 'expectedTypedef', + }, + ], + }, + { + code: `class Test { + public constructor(public x) { } + }`, + errors: [ + { + column: 28, + messageId: 'expectedTypedef', + }, + ], + }, // Property declarations { code: `type Test = {