From 156d5a9043fc3163e8e5439e5a6967ad6773fd91 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Thu, 5 Jan 2017 11:15:01 -0800 Subject: [PATCH] Add `| undefined` to all optional properties too in declarationEmitter.ts --- src/compiler/declarationEmitter.ts | 8 +++++--- ...efaultParameterAddsUndefinedWithStrictNullChecks.js | 2 +- .../reference/destructureOptionalParameter.js | 10 +++++----- tests/baselines/reference/optionalMethods.js | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index af32a5b4082..965cb2330b5 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -1593,9 +1593,11 @@ namespace ts { emitTypeOfVariableDeclarationFromTypeLiteral(node); } else if (!hasModifier(node.parent, ModifierFlags.Private)) { - // use the checker's type, not the declared type, for an initialized parameter (that isn't a parameter property) - const isInitializedParameter = node.initializer && !(getModifierFlags(node) & ModifierFlags.ParameterPropertyModifier); - const typeNode = isInitializedParameter ? undefined : node.type; + // use the checker's type, not the declared type, + // for optional parameters and initialized ones that aren't a parameter property + const typeShouldAddUndefined = resolver.isOptionalParameter(node) || + node.initializer && !(getModifierFlags(node) & ModifierFlags.ParameterPropertyModifier); + const typeNode = typeShouldAddUndefined ? undefined : node.type; writeTypeOfDeclaration(node, typeNode, getParameterDeclarationTypeVisibilityError); } diff --git a/tests/baselines/reference/defaultParameterAddsUndefinedWithStrictNullChecks.js b/tests/baselines/reference/defaultParameterAddsUndefinedWithStrictNullChecks.js index 50779650c3a..561fa65a154 100644 --- a/tests/baselines/reference/defaultParameterAddsUndefinedWithStrictNullChecks.js +++ b/tests/baselines/reference/defaultParameterAddsUndefinedWithStrictNullChecks.js @@ -88,7 +88,7 @@ function removeNothing(y) { //// [defaultParameterAddsUndefinedWithStrictNullChecks.d.ts] -declare function f(addUndefined1?: string | undefined, addUndefined2?: number): number; +declare function f(addUndefined1?: string | undefined, addUndefined2?: number | undefined): number; declare function g(addUndefined: string | undefined, addDefined: number): number; declare let total: number; declare function foo1(x: string | undefined, b: number): void; diff --git a/tests/baselines/reference/destructureOptionalParameter.js b/tests/baselines/reference/destructureOptionalParameter.js index 1ffe678b50c..f375c41dbed 100644 --- a/tests/baselines/reference/destructureOptionalParameter.js +++ b/tests/baselines/reference/destructureOptionalParameter.js @@ -36,7 +36,7 @@ function f2(_a) { declare function f1({a, b}?: { a: number; b: string; -}): void; +} | undefined): void; declare function f2({a, b}?: { a: number; b: number; @@ -49,11 +49,11 @@ interface QueryMetadata { } interface QueryMetadataFactory { (selector: Type | string, {descendants, read}?: { - descendants?: boolean; + descendants?: boolean | undefined; read?: any; - }): ParameterDecorator; + } | undefined): ParameterDecorator; new (selector: Type | string, {descendants, read}?: { - descendants?: boolean; + descendants?: boolean | undefined; read?: any; - }): QueryMetadata; + } | undefined): QueryMetadata; } diff --git a/tests/baselines/reference/optionalMethods.js b/tests/baselines/reference/optionalMethods.js index 28ed0bcd76e..c6051c622f5 100644 --- a/tests/baselines/reference/optionalMethods.js +++ b/tests/baselines/reference/optionalMethods.js @@ -132,7 +132,7 @@ declare class Bar { a: number; b?: number; c?: number | undefined; - constructor(d?: number, e?: number); + constructor(d?: number | undefined, e?: number); f(): number; g?(): number; h?(): number;