Skip to content

Commit 8e9de9b

Browse files
authored
Fix39458 (microsoft#39508)
* remove undefined from optional parameter * accept baselines * use getTypeWithFacts
1 parent 7c99086 commit 8e9de9b

File tree

6 files changed

+36
-1
lines changed

6 files changed

+36
-1
lines changed

src/compiler/checker.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5094,6 +5094,9 @@ namespace ts {
50945094
if (parameterDeclaration && isRequiredInitializedParameter(parameterDeclaration)) {
50955095
parameterType = getOptionalType(parameterType);
50965096
}
5097+
if ((context.flags & NodeBuilderFlags.NoUndefinedOptionalParameterType) && parameterDeclaration && !isJSDocParameterTag(parameterDeclaration) && isOptionalUninitializedParameter(parameterDeclaration)) {
5098+
parameterType = getTypeWithFacts(parameterType, TypeFacts.NEUndefined);
5099+
}
50975100
const parameterTypeNode = serializeTypeForDeclaration(context, parameterType, parameterSymbol, context.enclosingDeclaration, privateSymbolVisitor, bundledImports);
50985101

50995102
const modifiers = !(context.flags & NodeBuilderFlags.OmitParameterModifiers) && preserveModifierFlags && parameterDeclaration && parameterDeclaration.modifiers ? parameterDeclaration.modifiers.map(factory.cloneNode) : undefined;
@@ -36958,6 +36961,12 @@ namespace ts {
3695836961
hasSyntacticModifier(parameter, ModifierFlags.ParameterPropertyModifier);
3695936962
}
3696036963

36964+
function isOptionalUninitializedParameter(parameter: ParameterDeclaration) {
36965+
return !!strictNullChecks &&
36966+
isOptionalParameter(parameter) &&
36967+
!parameter.initializer;
36968+
}
36969+
3696136970
function isExpandoFunctionDeclaration(node: Declaration): boolean {
3696236971
const declaration = getParseTreeNode(node, isFunctionDeclaration);
3696336972
if (!declaration) {

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4160,6 +4160,7 @@ namespace ts {
41604160
UseAliasDefinedOutsideCurrentScope = 1 << 14, // Allow non-visible aliases
41614161
UseSingleQuotesForStringLiteralType = 1 << 28, // Use single quotes for string literal type
41624162
NoTypeReduction = 1 << 29, // Don't call getReducedType
4163+
NoUndefinedOptionalParameterType = 1 << 30, // Do not add undefined to optional parameter type
41634164

41644165
// Error handling
41654166
AllowThisInObjectLiteral = 1 << 15,

src/services/codefixes/helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ namespace ts.codefix {
164164
const program = context.program;
165165
const checker = program.getTypeChecker();
166166
const scriptTarget = getEmitScriptTarget(program.getCompilerOptions());
167-
const flags = NodeBuilderFlags.NoTruncation | NodeBuilderFlags.SuppressAnyReturnType | (quotePreference === QuotePreference.Single ? NodeBuilderFlags.UseSingleQuotesForStringLiteralType : 0);
167+
const flags = NodeBuilderFlags.NoTruncation | NodeBuilderFlags.NoUndefinedOptionalParameterType | NodeBuilderFlags.SuppressAnyReturnType | (quotePreference === QuotePreference.Single ? NodeBuilderFlags.UseSingleQuotesForStringLiteralType : 0);
168168
const signatureDeclaration = <MethodDeclaration>checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration, flags, getNoopSymbolTrackerWithResolver(context));
169169
if (!signatureDeclaration) {
170170
return undefined;

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2232,6 +2232,7 @@ declare namespace ts {
22322232
UseAliasDefinedOutsideCurrentScope = 16384,
22332233
UseSingleQuotesForStringLiteralType = 268435456,
22342234
NoTypeReduction = 536870912,
2235+
NoUndefinedOptionalParameterType = 1073741824,
22352236
AllowThisInObjectLiteral = 32768,
22362237
AllowQualifedNameInPlaceOfIdentifier = 65536,
22372238
AllowAnonymousIdentifier = 131072,

tests/baselines/reference/api/typescript.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2232,6 +2232,7 @@ declare namespace ts {
22322232
UseAliasDefinedOutsideCurrentScope = 16384,
22332233
UseSingleQuotesForStringLiteralType = 268435456,
22342234
NoTypeReduction = 536870912,
2235+
NoUndefinedOptionalParameterType = 1073741824,
22352236
AllowThisInObjectLiteral = 32768,
22362237
AllowQualifedNameInPlaceOfIdentifier = 65536,
22372238
AllowAnonymousIdentifier = 131072,
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
////interface IFoo {
4+
//// bar(x?: number | string): void;
5+
////}
6+
////
7+
////class Foo implements IFoo {
8+
////}
9+
10+
//https://github.com/microsoft/TypeScript/issues/39458
11+
verify.codeFix({
12+
description: [ts.Diagnostics.Implement_interface_0.message, "IFoo"],
13+
newFileContent:
14+
`interface IFoo {
15+
bar(x?: number | string): void;
16+
}
17+
18+
class Foo implements IFoo {
19+
bar(x?: string | number): void {
20+
throw new Error("Method not implemented.");
21+
}
22+
}`,
23+
});

0 commit comments

Comments
 (0)