diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 77c130b24de..88f8858be18 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -23128,6 +23128,13 @@ namespace ts { !(getModifierFlags(parameter) & ModifierFlags.ParameterPropertyModifier); } + function isOptionalUninitializedParameterProperty(parameter: ParameterDeclaration) { + return strictNullChecks && + isOptionalParameter(parameter) && + !parameter.initializer && + !!(getModifierFlags(parameter) & ModifierFlags.ParameterPropertyModifier); + } + function getNodeCheckFlags(node: Node): NodeCheckFlags { return getNodeLinks(node).flags; } @@ -23337,6 +23344,7 @@ namespace ts { isDeclarationVisible, isImplementationOfOverload, isRequiredInitializedParameter, + isOptionalUninitializedParameterProperty, writeTypeOfDeclaration, writeReturnTypeOfSignatureDeclaration, writeTypeOfExpression, diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index 8b4919e9da9..753080cc6a0 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -340,7 +340,7 @@ namespace ts { // these types may need to add `undefined`. const shouldUseResolverType = declaration.kind === SyntaxKind.Parameter && (resolver.isRequiredInitializedParameter(declaration as ParameterDeclaration) || - (getModifierFlags(declaration) & ModifierFlags.ParameterPropertyModifier && resolver.isOptionalParameter(declaration as ParameterDeclaration))); + resolver.isOptionalUninitializedParameterProperty(declaration as ParameterDeclaration)); if (type && !shouldUseResolverType) { // Write the type emitType(type); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 439091cece0..e9c004ec982 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -2814,6 +2814,7 @@ namespace ts { collectLinkedAliases(node: Identifier): Node[]; isImplementationOfOverload(node: FunctionLikeDeclaration): boolean | undefined; isRequiredInitializedParameter(node: ParameterDeclaration): boolean; + isOptionalUninitializedParameterProperty(node: ParameterDeclaration): boolean; writeTypeOfDeclaration(declaration: AccessorDeclaration | VariableLikeDeclaration, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter): void; writeReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter): void; writeTypeOfExpression(expr: Expression, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter): void;