From c7b0083820740b3078b1ce5503dee06099eba5eb Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 16 Nov 2016 15:15:30 -0800 Subject: [PATCH 1/2] Test widen literal types of parameter properties --- ...alTypesWidenInParameterPosition.errors.txt | 15 ++++++++++++ .../literalTypesWidenInParameterPosition.js | 23 +++++++++++++++++++ .../literalTypesWidenInParameterPosition.ts | 8 +++++++ 3 files changed, 46 insertions(+) create mode 100644 tests/baselines/reference/literalTypesWidenInParameterPosition.errors.txt create mode 100644 tests/baselines/reference/literalTypesWidenInParameterPosition.js create mode 100644 tests/cases/conformance/types/literal/literalTypesWidenInParameterPosition.ts diff --git a/tests/baselines/reference/literalTypesWidenInParameterPosition.errors.txt b/tests/baselines/reference/literalTypesWidenInParameterPosition.errors.txt new file mode 100644 index 00000000000..69d7196b978 --- /dev/null +++ b/tests/baselines/reference/literalTypesWidenInParameterPosition.errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/types/literal/literalTypesWidenInParameterPosition.ts(4,9): error TS2322: Type '5' is not assignable to type '1'. + + +==== tests/cases/conformance/types/literal/literalTypesWidenInParameterPosition.ts (1 errors) ==== + class D { + readonly noWiden = 1 + constructor(readonly widen = 2) { + this.noWiden = 5; // error + ~~~~~~~~~~~~ +!!! error TS2322: Type '5' is not assignable to type '1'. + this.widen = 6; // ok + } + } + new D(7); // ok + \ No newline at end of file diff --git a/tests/baselines/reference/literalTypesWidenInParameterPosition.js b/tests/baselines/reference/literalTypesWidenInParameterPosition.js new file mode 100644 index 00000000000..2c1d165b6ec --- /dev/null +++ b/tests/baselines/reference/literalTypesWidenInParameterPosition.js @@ -0,0 +1,23 @@ +//// [literalTypesWidenInParameterPosition.ts] +class D { + readonly noWiden = 1 + constructor(readonly widen = 2) { + this.noWiden = 5; // error + this.widen = 6; // ok + } +} +new D(7); // ok + + +//// [literalTypesWidenInParameterPosition.js] +var D = (function () { + function D(widen) { + if (widen === void 0) { widen = 2; } + this.widen = widen; + this.noWiden = 1; + this.noWiden = 5; // error + this.widen = 6; // ok + } + return D; +}()); +new D(7); // ok diff --git a/tests/cases/conformance/types/literal/literalTypesWidenInParameterPosition.ts b/tests/cases/conformance/types/literal/literalTypesWidenInParameterPosition.ts new file mode 100644 index 00000000000..f1d0a9b428a --- /dev/null +++ b/tests/cases/conformance/types/literal/literalTypesWidenInParameterPosition.ts @@ -0,0 +1,8 @@ +class D { + readonly noWiden = 1 + constructor(readonly widen = 2) { + this.noWiden = 5; // error + this.widen = 6; // ok + } +} +new D(7); // ok From 5dbe5f4fbdb7c91598441bffdee7577a71471c2c Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 16 Nov 2016 15:24:42 -0800 Subject: [PATCH 2/2] Widen literal types of parameter properties --- src/compiler/checker.ts | 2 +- src/compiler/utilities.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7132aedb324..b466bf7afb6 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14744,7 +14744,7 @@ namespace ts { function checkDeclarationInitializer(declaration: VariableLikeDeclaration) { const type = checkExpressionCached(declaration.initializer); return getCombinedNodeFlags(declaration) & NodeFlags.Const || - getCombinedModifierFlags(declaration) & ModifierFlags.Readonly || + getCombinedModifierFlags(declaration) & ModifierFlags.Readonly && !isParameterPropertyDeclaration(declaration) || isTypeAssertion(declaration.initializer) ? type : getWidenedLiteralType(type); } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index bfabb3b1e4a..546416884f1 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -4497,7 +4497,7 @@ namespace ts { } } - export function isParameterPropertyDeclaration(node: ParameterDeclaration): boolean { + export function isParameterPropertyDeclaration(node: Node): boolean { return hasModifier(node, ModifierFlags.ParameterPropertyModifier) && node.parent.kind === SyntaxKind.Constructor && isClassLike(node.parent.parent); }