Merge pull request #12312 from Microsoft/widen-literal-types-of-parameter-properties

Widen literal types of parameter properties
This commit is contained in:
Nathan Shively-Sanders
2016-11-16 15:51:42 -08:00
committed by GitHub
5 changed files with 48 additions and 2 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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