diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index 4e91a28dafa..d3d5a46e0ec 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -138,7 +138,7 @@ namespace ts.codefix { } else { Debug.assert(declarations.length === signatures.length, "Declarations and signatures should match count"); - addClassElement(createMethodImplementingSignatures(signatures, name, optional, modifiers, quotePreference)); + addClassElement(createMethodImplementingSignatures(checker, context, enclosingDeclaration, signatures, name, optional, modifiers, quotePreference)); } } break; @@ -338,6 +338,9 @@ namespace ts.codefix { } function createMethodImplementingSignatures( + checker: TypeChecker, + context: TypeConstructionContext, + enclosingDeclaration: ClassLikeDeclaration, signatures: readonly Signature[], name: PropertyName, optional: boolean, @@ -362,7 +365,6 @@ namespace ts.codefix { } const maxNonRestArgs = maxArgsSignature.parameters.length - (signatureHasRestParameter(maxArgsSignature) ? 1 : 0); const maxArgsParameterSymbolNames = maxArgsSignature.parameters.map(symbol => symbol.name); - const parameters = createDummyParameters(maxNonRestArgs, maxArgsParameterSymbolNames, /* types */ undefined, minArgumentCount, /*inJs*/ false); if (someSigHasRestParameter) { @@ -384,10 +386,17 @@ namespace ts.codefix { optional, /*typeParameters*/ undefined, parameters, - /*returnType*/ undefined, + getReturnTypeFromSignatures(signatures, checker, context, enclosingDeclaration), quotePreference); } + function getReturnTypeFromSignatures(signatures: readonly Signature[], checker: TypeChecker, context: TypeConstructionContext, enclosingDeclaration: ClassLikeDeclaration): TypeNode | undefined { + if (length(signatures)) { + const type = checker.getUnionType(map(signatures, checker.getReturnTypeOfSignature)); + return checker.typeToTypeNode(type, enclosingDeclaration, /*flags*/ undefined, getNoopSymbolTrackerWithResolver(context)); + } + } + function createStubbedMethod( modifiers: readonly Modifier[] | undefined, name: PropertyName, diff --git a/tests/cases/fourslash/codeFixClassExtendAbstractMethod.ts b/tests/cases/fourslash/codeFixClassExtendAbstractMethod.ts index abb3f4a5703..cfab4853025 100644 --- a/tests/cases/fourslash/codeFixClassExtendAbstractMethod.ts +++ b/tests/cases/fourslash/codeFixClassExtendAbstractMethod.ts @@ -26,7 +26,7 @@ class C extends A { f(a: number, b: string): this; f(a: string, b: number): Function; f(a: string): Function; - f(a: any, b?: any) { + f(a: any, b?: any): boolean | Function | this { throw new Error("Method not implemented."); } foo(): number { diff --git a/tests/cases/fourslash/codeFixClassImplementInterfaceComputedPropertyNameWellKnownSymbols.ts b/tests/cases/fourslash/codeFixClassImplementInterfaceComputedPropertyNameWellKnownSymbols.ts index 0fc8f3767d9..163fad1cb9b 100644 --- a/tests/cases/fourslash/codeFixClassImplementInterfaceComputedPropertyNameWellKnownSymbols.ts +++ b/tests/cases/fourslash/codeFixClassImplementInterfaceComputedPropertyNameWellKnownSymbols.ts @@ -62,7 +62,7 @@ class C implements I { [Symbol.toPrimitive](hint: "number"): number; [Symbol.toPrimitive](hint: "default"): number; [Symbol.toPrimitive](hint: "string"): string; - [Symbol.toPrimitive](hint: any) { + [Symbol.toPrimitive](hint: any): string | number { throw new Error("Method not implemented."); } [Symbol.toStringTag]: string; diff --git a/tests/cases/fourslash/codeFixClassImplementInterfaceMethodTypePredicate.ts b/tests/cases/fourslash/codeFixClassImplementInterfaceMethodTypePredicate.ts index 45bd6096142..f581a831cc7 100644 --- a/tests/cases/fourslash/codeFixClassImplementInterfaceMethodTypePredicate.ts +++ b/tests/cases/fourslash/codeFixClassImplementInterfaceMethodTypePredicate.ts @@ -18,7 +18,7 @@ verify.codeFix({ class C implements I { f(i: any): i is I; f(): this is I; - f(i?: any) { + f(i?: any): boolean { throw new Error("Method not implemented."); } }`, diff --git a/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignatures.ts b/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignatures.ts index ddfc21615a3..f036ca38058 100644 --- a/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignatures.ts +++ b/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignatures.ts @@ -21,7 +21,7 @@ class C implements I { method(a: number, b: string): boolean; method(a: string, b: number): Function; method(a: string): Function; - method(a: any, b?: any) { + method(a: any, b?: any): boolean | Function { throw new Error("Method not implemented."); } }`, diff --git a/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignaturesRest1.ts b/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignaturesRest1.ts index 868a48711b2..b5da1ffec4c 100644 --- a/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignaturesRest1.ts +++ b/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignaturesRest1.ts @@ -21,7 +21,7 @@ class C implements I { method(a: number, ...b: string[]): boolean; method(a: string, ...b: number[]): Function; method(a: string): Function; - method(a: any, ...b?: any[]) { + method(a: any, ...b?: any[]): boolean | Function { throw new Error("Method not implemented."); } }`, diff --git a/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignaturesRest2.ts b/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignaturesRest2.ts index 29689f17ea7..c1cf60ab1bc 100644 --- a/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignaturesRest2.ts +++ b/tests/cases/fourslash/codeFixClassImplementInterfaceMultipleSignaturesRest2.ts @@ -21,7 +21,7 @@ class C implements I { method(a: number, ...b: string[]): boolean; method(a: string, b: number): Function; method(a: string): Function; - method(a: any, b?: any, ...rest?: any[]) { + method(a: any, b?: any, ...rest?: any[]): boolean | Function { throw new Error("Method not implemented."); } }`,