fix(40617): handle uninitialized class member with computed key (#45974)

This commit is contained in:
Oleksandr T
2022-03-05 02:03:36 +02:00
committed by GitHub
parent f9ae305dda
commit 162713fac9
46 changed files with 1374 additions and 164 deletions
+1 -1
View File
@@ -889,7 +889,7 @@ namespace ts {
return isDottedName(expr)
|| (isPropertyAccessExpression(expr) || isNonNullExpression(expr) || isParenthesizedExpression(expr)) && isNarrowableReference(expr.expression)
|| isBinaryExpression(expr) && expr.operatorToken.kind === SyntaxKind.CommaToken && isNarrowableReference(expr.right)
|| isElementAccessExpression(expr) && isStringOrNumericLiteralLike(expr.argumentExpression) && isNarrowableReference(expr.expression)
|| isElementAccessExpression(expr) && (isStringOrNumericLiteralLike(expr.argumentExpression) || isEntityNameExpression(expr.argumentExpression)) && isNarrowableReference(expr.expression)
|| isAssignmentExpression(expr) && isNarrowableReference(expr.left);
}
+55 -12
View File
@@ -22877,9 +22877,10 @@ namespace ts {
return isMatchingReference((source as NonNullExpression | ParenthesizedExpression).expression, target);
case SyntaxKind.PropertyAccessExpression:
case SyntaxKind.ElementAccessExpression:
return isAccessExpression(target) &&
getAccessedPropertyName(source as AccessExpression) === getAccessedPropertyName(target) &&
isMatchingReference((source as AccessExpression).expression, target.expression);
const sourcePropertyName = getAccessedPropertyName(source as AccessExpression);
const targetPropertyName = isAccessExpression(target) ? getAccessedPropertyName(target) : undefined;
return sourcePropertyName !== undefined && targetPropertyName !== undefined && targetPropertyName === sourcePropertyName &&
isMatchingReference((source as AccessExpression).expression, (target as AccessExpression).expression);
case SyntaxKind.QualifiedName:
return isAccessExpression(target) &&
(source as QualifiedName).right.escapedText === getAccessedPropertyName(target) &&
@@ -22891,12 +22892,52 @@ namespace ts {
}
function getAccessedPropertyName(access: AccessExpression | BindingElement | ParameterDeclaration): __String | undefined {
let propertyName;
return access.kind === SyntaxKind.PropertyAccessExpression ? access.name.escapedText :
access.kind === SyntaxKind.ElementAccessExpression && isStringOrNumericLiteralLike(access.argumentExpression) ? escapeLeadingUnderscores(access.argumentExpression.text) :
access.kind === SyntaxKind.BindingElement && (propertyName = getDestructuringPropertyName(access)) ? escapeLeadingUnderscores(propertyName) :
access.kind === SyntaxKind.Parameter ? ("" + access.parent.parameters.indexOf(access)) as __String :
undefined;
if (isPropertyAccessExpression(access)) {
return access.name.escapedText;
}
if (isElementAccessExpression(access)) {
return tryGetElementAccessExpressionName(access);
}
if (isBindingElement(access)) {
const name = getDestructuringPropertyName(access);
return name ? escapeLeadingUnderscores(name) : undefined;
}
if (isParameter(access)) {
return ("" + access.parent.parameters.indexOf(access)) as __String;
}
return undefined;
}
function tryGetNameFromType(type: Type) {
return type.flags & TypeFlags.UniqueESSymbol ? (type as UniqueESSymbolType).escapedName :
type.flags & TypeFlags.StringOrNumberLiteral ? escapeLeadingUnderscores("" + (type as StringLiteralType | NumberLiteralType).value) : undefined;
}
function tryGetElementAccessExpressionName(node: ElementAccessExpression) {
if (isStringOrNumericLiteralLike(node.argumentExpression)) {
return escapeLeadingUnderscores(node.argumentExpression.text);
}
if (isEntityNameExpression(node.argumentExpression)) {
const symbol = resolveEntityName(node.argumentExpression, SymbolFlags.Value, /*ignoreErrors*/ true);
if (!symbol || !isConstVariable(symbol)) return undefined;
const declaration = symbol.valueDeclaration;
if (declaration === undefined) return undefined;
const type = tryGetTypeFromEffectiveTypeNode(declaration);
if (type) {
const name = tryGetNameFromType(type);
if (name !== undefined) {
return name;
}
}
if (hasOnlyExpressionInitializer(declaration)) {
const initializer = getEffectiveInitializer(declaration);
return initializer && tryGetNameFromType(getTypeOfExpression(initializer));
}
}
return undefined;
}
function containsMatchingReference(source: Node, target: Node) {
@@ -39529,7 +39570,7 @@ namespace ts {
}
if (!isStatic(member) && isPropertyWithoutInitializer(member)) {
const propName = (member as PropertyDeclaration).name;
if (isIdentifier(propName) || isPrivateIdentifier(propName)) {
if (isIdentifier(propName) || isPrivateIdentifier(propName) || isComputedPropertyName(propName)) {
const type = getTypeOfSymbol(getSymbolOfNode(member));
if (!(type.flags & TypeFlags.AnyOrUnknown || getFalsyFlags(type) & TypeFlags.Undefined)) {
if (!constructor || !isPropertyInitializedInConstructor(propName, type, constructor)) {
@@ -39565,8 +39606,10 @@ namespace ts {
return false;
}
function isPropertyInitializedInConstructor(propName: Identifier | PrivateIdentifier, propType: Type, constructor: ConstructorDeclaration) {
const reference = factory.createPropertyAccessExpression(factory.createThis(), propName);
function isPropertyInitializedInConstructor(propName: Identifier | PrivateIdentifier | ComputedPropertyName, propType: Type, constructor: ConstructorDeclaration) {
const reference = isComputedPropertyName(propName)
? factory.createElementAccessExpression(factory.createThis(), propName.expression)
: factory.createPropertyAccessExpression(factory.createThis(), propName);
setParent(reference.expression, reference);
setParent(reference, constructor);
reference.flowNode = constructor.returnFlowNode;
+1 -1
View File
@@ -2755,7 +2755,7 @@ namespace ts {
function getPropFromRaw<T>(prop: "files" | "include" | "exclude" | "references", validateElement: (value: unknown) => boolean, elementTypeName: string): PropOfRaw<T> {
if (hasProperty(raw, prop) && !isNullOrUndefined(raw[prop])) {
if (isArray(raw[prop])) {
const result = raw[prop];
const result = raw[prop] as T[];
if (!sourceFile && !every(result, validateElement)) {
errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_requires_a_value_of_type_1, prop, elementTypeName));
}
@@ -27,21 +27,21 @@ if (foo[x] === undefined) {
}
else {
let nu = foo[x]
>nu : number | undefined
>foo[x] : number | undefined
>nu : number
>foo[x] : number
>foo : Dictionary<number>
>x : "bar"
let n = foo[x]
>n : number | undefined
>foo[x] : number | undefined
>n : number
>foo[x] : number
>foo : Dictionary<number>
>x : "bar"
foo[x]!++
>foo[x]!++ : number
>foo[x]! : number
>foo[x] : number | undefined
>foo[x] : number
>foo : Dictionary<number>
>x : "bar"
}
@@ -164,4 +164,19 @@ tests/cases/conformance/classes/propertyMemberDeclarations/strictPropertyInitial
this.#b = someValue();
}
}
const a = 'a';
const b = Symbol();
class C12 {
[a]: number;
[b]: number;
['c']: number;
constructor() {
this[a] = 1;
this[b] = 1;
this['c'] = 1;
}
}
@@ -132,6 +132,21 @@ class C11 {
this.#b = someValue();
}
}
const a = 'a';
const b = Symbol();
class C12 {
[a]: number;
[b]: number;
['c']: number;
constructor() {
this[a] = 1;
this[b] = 1;
this['c'] = 1;
}
}
//// [strictPropertyInitialization.js]
@@ -235,6 +250,15 @@ class C11 {
}
}
_C11_b = new WeakMap();
const a = 'a';
const b = Symbol();
class C12 {
constructor() {
this[a] = 1;
this[b] = 1;
this['c'] = 1;
}
}
//// [strictPropertyInitialization.d.ts]
@@ -303,3 +327,11 @@ declare class C11 {
a: number;
constructor();
}
declare const a = "a";
declare const b: unique symbol;
declare class C12 {
[a]: number;
[b]: number;
['c']: number;
constructor();
}
@@ -311,3 +311,40 @@ class C11 {
}
}
const a = 'a';
>a : Symbol(a, Decl(strictPropertyInitialization.ts, 134, 5))
const b = Symbol();
>b : Symbol(b, Decl(strictPropertyInitialization.ts, 135, 5))
>Symbol : Symbol(Symbol, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
class C12 {
>C12 : Symbol(C12, Decl(strictPropertyInitialization.ts, 135, 19))
[a]: number;
>[a] : Symbol(C12[a], Decl(strictPropertyInitialization.ts, 137, 11))
>a : Symbol(a, Decl(strictPropertyInitialization.ts, 134, 5))
[b]: number;
>[b] : Symbol(C12[b], Decl(strictPropertyInitialization.ts, 138, 16))
>b : Symbol(b, Decl(strictPropertyInitialization.ts, 135, 5))
['c']: number;
>['c'] : Symbol(C12['c'], Decl(strictPropertyInitialization.ts, 139, 16))
>'c' : Symbol(C12['c'], Decl(strictPropertyInitialization.ts, 139, 16))
constructor() {
this[a] = 1;
>this : Symbol(C12, Decl(strictPropertyInitialization.ts, 135, 19))
>a : Symbol(a, Decl(strictPropertyInitialization.ts, 134, 5))
this[b] = 1;
>this : Symbol(C12, Decl(strictPropertyInitialization.ts, 135, 19))
>b : Symbol(b, Decl(strictPropertyInitialization.ts, 135, 5))
this['c'] = 1;
>this : Symbol(C12, Decl(strictPropertyInitialization.ts, 135, 19))
>'c' : Symbol(C12['c'], Decl(strictPropertyInitialization.ts, 139, 16))
}
}
@@ -347,3 +347,51 @@ class C11 {
}
}
const a = 'a';
>a : "a"
>'a' : "a"
const b = Symbol();
>b : unique symbol
>Symbol() : unique symbol
>Symbol : SymbolConstructor
class C12 {
>C12 : C12
[a]: number;
>[a] : number
>a : "a"
[b]: number;
>[b] : number
>b : unique symbol
['c']: number;
>['c'] : number
>'c' : "c"
constructor() {
this[a] = 1;
>this[a] = 1 : 1
>this[a] : number
>this : this
>a : "a"
>1 : 1
this[b] = 1;
>this[b] = 1 : 1
>this[b] : number
>this : this
>b : unique symbol
>1 : 1
this['c'] = 1;
>this['c'] = 1 : 1
>this['c'] : number
>this : this
>'c' : "c"
>1 : 1
}
}
@@ -1,4 +1,4 @@
//// [typeGuardNarrowsIndexedAccessOfKnownProperty.ts]
//// [typeGuardNarrowsIndexedAccessOfKnownProperty1.ts]
interface Square {
["dash-ok"]: "square";
["square-size"]: number;
@@ -80,7 +80,7 @@ export function g(pair: [number, string?]): string {
}
//// [typeGuardNarrowsIndexedAccessOfKnownProperty.js]
//// [typeGuardNarrowsIndexedAccessOfKnownProperty1.js]
"use strict";
exports.__esModule = true;
exports.g = void 0;
@@ -1,254 +1,254 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty.ts ===
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty1.ts ===
interface Square {
>Square : Symbol(Square, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 0, 0))
>Square : Symbol(Square, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 0, 0))
["dash-ok"]: "square";
>["dash-ok"] : Symbol(Square["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 0, 18))
>"dash-ok" : Symbol(Square["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 0, 18))
>["dash-ok"] : Symbol(Square["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 0, 18))
>"dash-ok" : Symbol(Square["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 0, 18))
["square-size"]: number;
>["square-size"] : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 1, 26))
>"square-size" : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 1, 26))
>["square-size"] : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 1, 26))
>"square-size" : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 1, 26))
}
interface Rectangle {
>Rectangle : Symbol(Rectangle, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 3, 1))
>Rectangle : Symbol(Rectangle, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 3, 1))
["dash-ok"]: "rectangle";
>["dash-ok"] : Symbol(Rectangle["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 4, 22))
>"dash-ok" : Symbol(Rectangle["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 4, 22))
>["dash-ok"] : Symbol(Rectangle["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 4, 22))
>"dash-ok" : Symbol(Rectangle["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 4, 22))
width: number;
>width : Symbol(Rectangle.width, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 5, 29))
>width : Symbol(Rectangle.width, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 5, 29))
height: number;
>height : Symbol(Rectangle.height, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 6, 18))
>height : Symbol(Rectangle.height, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 6, 18))
}
interface Circle {
>Circle : Symbol(Circle, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 8, 1))
>Circle : Symbol(Circle, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 8, 1))
["dash-ok"]: "circle";
>["dash-ok"] : Symbol(Circle["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 9, 19))
>"dash-ok" : Symbol(Circle["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 9, 19))
>["dash-ok"] : Symbol(Circle["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 9, 19))
>"dash-ok" : Symbol(Circle["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 9, 19))
radius: number;
>radius : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 10, 26))
>radius : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 10, 26))
}
type Shape = Square | Rectangle | Circle;
>Shape : Symbol(Shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 12, 1))
>Square : Symbol(Square, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 0, 0))
>Rectangle : Symbol(Rectangle, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 3, 1))
>Circle : Symbol(Circle, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 8, 1))
>Shape : Symbol(Shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 12, 1))
>Square : Symbol(Square, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 0, 0))
>Rectangle : Symbol(Rectangle, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 3, 1))
>Circle : Symbol(Circle, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 8, 1))
interface Subshape {
>Subshape : Symbol(Subshape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 13, 42))
>Subshape : Symbol(Subshape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 13, 42))
"0": {
>"0" : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 14, 20))
>"0" : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 14, 20))
sub: {
>sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
under: {
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
shape: Shape;
>shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>Shape : Symbol(Shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 12, 1))
>shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>Shape : Symbol(Shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 12, 1))
}
}
}
}
function area(s: Shape): number {
>area : Symbol(area, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 22, 1))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 23, 14))
>Shape : Symbol(Shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 12, 1))
>area : Symbol(area, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 22, 1))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 23, 14))
>Shape : Symbol(Shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 12, 1))
switch(s['dash-ok']) {
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 23, 14))
>'dash-ok' : Symbol(["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 0, 18), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 4, 22), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 9, 19))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 23, 14))
>'dash-ok' : Symbol(["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 0, 18), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 4, 22), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 9, 19))
case "square": return s['square-size'] * s['square-size'];
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 23, 14))
>'square-size' : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 1, 26))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 23, 14))
>'square-size' : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 1, 26))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 23, 14))
>'square-size' : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 1, 26))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 23, 14))
>'square-size' : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 1, 26))
case "rectangle": return s.width * s['height'];
>s.width : Symbol(Rectangle.width, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 5, 29))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 23, 14))
>width : Symbol(Rectangle.width, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 5, 29))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 23, 14))
>'height' : Symbol(Rectangle.height, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 6, 18))
>s.width : Symbol(Rectangle.width, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 5, 29))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 23, 14))
>width : Symbol(Rectangle.width, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 5, 29))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 23, 14))
>'height' : Symbol(Rectangle.height, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 6, 18))
case "circle": return Math.PI * s['radius'] * s.radius;
>Math.PI : Symbol(Math.PI, Decl(lib.es5.d.ts, --, --))
>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>PI : Symbol(Math.PI, Decl(lib.es5.d.ts, --, --))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 23, 14))
>'radius' : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 10, 26))
>s.radius : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 10, 26))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 23, 14))
>radius : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 10, 26))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 23, 14))
>'radius' : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 10, 26))
>s.radius : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 10, 26))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 23, 14))
>radius : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 10, 26))
}
}
function subarea(s: Subshape): number {
>subarea : Symbol(subarea, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 29, 1))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 30, 17))
>Subshape : Symbol(Subshape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 13, 42))
>subarea : Symbol(subarea, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 29, 1))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 30, 17))
>Subshape : Symbol(Subshape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 13, 42))
switch(s[0]["sub"].under["shape"]["dash-ok"]) {
>s[0]["sub"].under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 14, 20))
>"sub" : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>"shape" : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>"dash-ok" : Symbol(["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 0, 18), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 4, 22), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 9, 19))
>s[0]["sub"].under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 14, 20))
>"sub" : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>"shape" : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>"dash-ok" : Symbol(["dash-ok"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 0, 18), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 4, 22), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 9, 19))
case "square": return s[0].sub.under.shape["square-size"] * s[0].sub.under.shape["square-size"];
>s[0].sub.under.shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>s[0].sub.under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>s[0].sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 14, 20))
>sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>"square-size" : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 1, 26))
>s[0].sub.under.shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>s[0].sub.under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>s[0].sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 14, 20))
>sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>"square-size" : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 1, 26))
>s[0].sub.under.shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>s[0].sub.under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>s[0].sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 14, 20))
>sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>"square-size" : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 1, 26))
>s[0].sub.under.shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>s[0].sub.under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>s[0].sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 14, 20))
>sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>"square-size" : Symbol(Square["square-size"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 1, 26))
case "rectangle": return s[0]["sub"]["under"]["shape"]["width"] * s[0]["sub"]["under"]["shape"].height;
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 14, 20))
>"sub" : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>"under" : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>"shape" : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>"width" : Symbol(Rectangle.width, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 5, 29))
>s[0]["sub"]["under"]["shape"].height : Symbol(Rectangle.height, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 6, 18))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 14, 20))
>"sub" : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>"under" : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>"shape" : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>height : Symbol(Rectangle.height, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 6, 18))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 14, 20))
>"sub" : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
>"under" : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>"shape" : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>"width" : Symbol(Rectangle.width, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 5, 29))
>s[0]["sub"]["under"]["shape"].height : Symbol(Rectangle.height, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 6, 18))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 14, 20))
>"sub" : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
>"under" : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>"shape" : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>height : Symbol(Rectangle.height, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 6, 18))
case "circle": return Math.PI * s[0].sub.under["shape"].radius * s[0]["sub"].under.shape["radius"];
>Math.PI : Symbol(Math.PI, Decl(lib.es5.d.ts, --, --))
>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>PI : Symbol(Math.PI, Decl(lib.es5.d.ts, --, --))
>s[0].sub.under["shape"].radius : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 10, 26))
>s[0].sub.under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>s[0].sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 14, 20))
>sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>"shape" : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>radius : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 10, 26))
>s[0]["sub"].under.shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>s[0]["sub"].under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 14, 20))
>"sub" : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 15, 10))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 16, 14))
>shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 17, 20))
>"radius" : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 10, 26))
>s[0].sub.under["shape"].radius : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 10, 26))
>s[0].sub.under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>s[0].sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 14, 20))
>sub : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>"shape" : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>radius : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 10, 26))
>s[0]["sub"].under.shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>s[0]["sub"].under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>s : Symbol(s, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 30, 17))
>0 : Symbol(Subshape["0"], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 14, 20))
>"sub" : Symbol(sub, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 15, 10))
>under : Symbol(under, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 16, 14))
>shape : Symbol(shape, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 17, 20))
>"radius" : Symbol(Circle.radius, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 10, 26))
}
}
interface X {
>X : Symbol(X, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 36, 1))
>X : Symbol(X, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 36, 1))
0: "xx",
>0 : Symbol(X[0], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 38, 13))
>0 : Symbol(X[0], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 38, 13))
1: number
>1 : Symbol(X[1], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 39, 12))
>1 : Symbol(X[1], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 39, 12))
}
interface Y {
>Y : Symbol(Y, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 41, 1))
>Y : Symbol(Y, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 41, 1))
0: "yy",
>0 : Symbol(Y[0], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 43, 13))
>0 : Symbol(Y[0], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 43, 13))
1: string
>1 : Symbol(Y[1], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 44, 12))
>1 : Symbol(Y[1], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 44, 12))
}
type A = ["aa", number];
>A : Symbol(A, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 46, 1))
>A : Symbol(A, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 46, 1))
type B = ["bb", string];
>B : Symbol(B, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 48, 24))
>B : Symbol(B, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 48, 24))
type Z = X | Y;
>Z : Symbol(Z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 49, 24))
>X : Symbol(X, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 36, 1))
>Y : Symbol(Y, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 41, 1))
>Z : Symbol(Z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 49, 24))
>X : Symbol(X, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 36, 1))
>Y : Symbol(Y, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 41, 1))
type C = A | B;
>C : Symbol(C, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 51, 15))
>A : Symbol(A, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 46, 1))
>B : Symbol(B, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 48, 24))
>C : Symbol(C, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 51, 15))
>A : Symbol(A, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 46, 1))
>B : Symbol(B, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 48, 24))
function check(z: Z, c: C) {
>check : Symbol(check, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 53, 15))
>z : Symbol(z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 55, 15))
>Z : Symbol(Z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 49, 24))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 55, 20))
>C : Symbol(C, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 51, 15))
>check : Symbol(check, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 53, 15))
>z : Symbol(z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 55, 15))
>Z : Symbol(Z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 49, 24))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 55, 20))
>C : Symbol(C, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 51, 15))
z[0] // fine, typescript sees "xx" | "yy"
>z : Symbol(z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 55, 15))
>0 : Symbol(0, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 38, 13), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 43, 13))
>z : Symbol(z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 55, 15))
>0 : Symbol(0, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 38, 13), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 43, 13))
switch (z[0]) {
>z : Symbol(z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 55, 15))
>0 : Symbol(0, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 38, 13), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 43, 13))
>z : Symbol(z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 55, 15))
>0 : Symbol(0, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 38, 13), Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 43, 13))
case "xx":
var xx: number = z[1] // should be number
>xx : Symbol(xx, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 59, 15))
>z : Symbol(z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 55, 15))
>1 : Symbol(X[1], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 39, 12))
>xx : Symbol(xx, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 59, 15))
>z : Symbol(z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 55, 15))
>1 : Symbol(X[1], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 39, 12))
break;
case "yy":
var yy: string = z[1] // should be string
>yy : Symbol(yy, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 62, 15))
>z : Symbol(z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 55, 15))
>1 : Symbol(Y[1], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 44, 12))
>yy : Symbol(yy, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 62, 15))
>z : Symbol(z, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 55, 15))
>1 : Symbol(Y[1], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 44, 12))
break;
}
c[0] // fine, typescript sees "xx" | "yy"
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 55, 20))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 55, 20))
>0 : Symbol(0)
switch (c[0]) {
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 55, 20))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 55, 20))
>0 : Symbol(0)
case "aa":
var aa: number = c[1] // should be number
>aa : Symbol(aa, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 68, 15))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 55, 20))
>aa : Symbol(aa, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 68, 15))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 55, 20))
>1 : Symbol(1)
break;
case "bb":
var bb: string = c[1] // should be string
>bb : Symbol(bb, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 71, 15))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 55, 20))
>bb : Symbol(bb, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 71, 15))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 55, 20))
>1 : Symbol(1)
break;
@@ -256,13 +256,13 @@ function check(z: Z, c: C) {
}
export function g(pair: [number, string?]): string {
>g : Symbol(g, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 74, 1))
>pair : Symbol(pair, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 76, 18))
>g : Symbol(g, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 74, 1))
>pair : Symbol(pair, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 76, 18))
return pair[1] ? pair[1] : 'nope';
>pair : Symbol(pair, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 76, 18))
>pair : Symbol(pair, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 76, 18))
>1 : Symbol(1)
>pair : Symbol(pair, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty.ts, 76, 18))
>pair : Symbol(pair, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty1.ts, 76, 18))
>1 : Symbol(1)
}
@@ -1,4 +1,4 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty.ts ===
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty1.ts ===
interface Square {
["dash-ok"]: "square";
>["dash-ok"] : "square"
@@ -0,0 +1,18 @@
//// [typeGuardNarrowsIndexedAccessOfKnownProperty2.ts]
const foo: { key?: number } = {};
const key = 'key' as const;
if (foo[key]) {
foo[key]; // number
foo.key; // number
}
//// [typeGuardNarrowsIndexedAccessOfKnownProperty2.js]
"use strict";
var foo = {};
var key = 'key';
if (foo[key]) {
foo[key]; // number
foo.key; // number
}
@@ -0,0 +1,23 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty2.ts ===
const foo: { key?: number } = {};
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty2.ts, 0, 5))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty2.ts, 0, 12))
const key = 'key' as const;
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty2.ts, 1, 5))
>const : Symbol(const)
if (foo[key]) {
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty2.ts, 0, 5))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty2.ts, 1, 5))
foo[key]; // number
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty2.ts, 0, 5))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty2.ts, 1, 5))
foo.key; // number
>foo.key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty2.ts, 0, 12))
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty2.ts, 0, 5))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty2.ts, 0, 12))
}
@@ -0,0 +1,27 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty2.ts ===
const foo: { key?: number } = {};
>foo : { key?: number | undefined; }
>key : number | undefined
>{} : {}
const key = 'key' as const;
>key : "key"
>'key' as const : "key"
>'key' : "key"
if (foo[key]) {
>foo[key] : number | undefined
>foo : { key?: number | undefined; }
>key : "key"
foo[key]; // number
>foo[key] : number
>foo : { key?: number | undefined; }
>key : "key"
foo.key; // number
>foo.key : number
>foo : { key?: number | undefined; }
>key : number
}
@@ -0,0 +1,18 @@
//// [typeGuardNarrowsIndexedAccessOfKnownProperty3.ts]
type Foo = (number | undefined)[] | undefined;
const foo: Foo = [1, 2, 3];
const index = 1;
if (foo !== undefined && foo[index] !== undefined && foo[index] >= 0) {
foo[index] // number
}
//// [typeGuardNarrowsIndexedAccessOfKnownProperty3.js]
"use strict";
var foo = [1, 2, 3];
var index = 1;
if (foo !== undefined && foo[index] !== undefined && foo[index] >= 0) {
foo[index]; // number
}
@@ -0,0 +1,25 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty3.ts ===
type Foo = (number | undefined)[] | undefined;
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 0, 0))
const foo: Foo = [1, 2, 3];
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 2, 5))
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 0, 0))
const index = 1;
>index : Symbol(index, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 3, 5))
if (foo !== undefined && foo[index] !== undefined && foo[index] >= 0) {
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 2, 5))
>undefined : Symbol(undefined)
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 2, 5))
>index : Symbol(index, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 3, 5))
>undefined : Symbol(undefined)
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 2, 5))
>index : Symbol(index, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 3, 5))
foo[index] // number
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 2, 5))
>index : Symbol(index, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty3.ts, 3, 5))
}
@@ -0,0 +1,38 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty3.ts ===
type Foo = (number | undefined)[] | undefined;
>Foo : Foo
const foo: Foo = [1, 2, 3];
>foo : Foo
>[1, 2, 3] : number[]
>1 : 1
>2 : 2
>3 : 3
const index = 1;
>index : 1
>1 : 1
if (foo !== undefined && foo[index] !== undefined && foo[index] >= 0) {
>foo !== undefined && foo[index] !== undefined && foo[index] >= 0 : boolean
>foo !== undefined && foo[index] !== undefined : boolean
>foo !== undefined : boolean
>foo : (number | undefined)[]
>undefined : undefined
>foo[index] !== undefined : boolean
>foo[index] : number | undefined
>foo : (number | undefined)[]
>index : 1
>undefined : undefined
>foo[index] >= 0 : boolean
>foo[index] : number
>foo : (number | undefined)[]
>index : 1
>0 : 0
foo[index] // number
>foo[index] : number
>foo : (number | undefined)[]
>index : 1
}
@@ -0,0 +1,28 @@
//// [typeGuardNarrowsIndexedAccessOfKnownProperty4.ts]
class Foo {
x: number | undefined;
constructor() {
this.x = 5;
this.x; // number
this['x']; // number
const key = 'x';
this[key]; // number
}
}
//// [typeGuardNarrowsIndexedAccessOfKnownProperty4.js]
"use strict";
var Foo = /** @class */ (function () {
function Foo() {
this.x = 5;
this.x; // number
this['x']; // number
var key = 'x';
this[key]; // number
}
return Foo;
}());
@@ -0,0 +1,31 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty4.ts ===
class Foo {
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 0))
x: number | undefined;
>x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 11))
constructor() {
this.x = 5;
>this.x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 11))
>this : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 0))
>x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 11))
this.x; // number
>this.x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 11))
>this : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 0))
>x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 11))
this['x']; // number
>this : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 0))
>'x' : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 11))
const key = 'x';
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 9, 13))
this[key]; // number
>this : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 0, 0))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty4.ts, 9, 13))
}
}
@@ -0,0 +1,36 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty4.ts ===
class Foo {
>Foo : Foo
x: number | undefined;
>x : number | undefined
constructor() {
this.x = 5;
>this.x = 5 : 5
>this.x : number | undefined
>this : this
>x : number | undefined
>5 : 5
this.x; // number
>this.x : number
>this : this
>x : number
this['x']; // number
>this['x'] : number
>this : this
>'x' : "x"
const key = 'x';
>key : "x"
>'x' : "x"
this[key]; // number
>this[key] : number
>this : this
>key : "x"
}
}
@@ -0,0 +1,40 @@
//// [typeGuardNarrowsIndexedAccessOfKnownProperty5.ts]
const a: { key?: { x?: number } } = {};
const aIndex = "key";
if (a[aIndex] && a[aIndex].x) {
a[aIndex].x // number
}
const b: { key: { x?: number } } = { key: {} };
const bIndex = "key";
if (b[bIndex].x) {
b[bIndex].x // number
}
interface Foo {
x: number | undefined;
}
const c: Foo[] = [];
const cIndex = 1;
if (c[cIndex].x) {
c[cIndex].x // number
}
//// [typeGuardNarrowsIndexedAccessOfKnownProperty5.js]
"use strict";
var a = {};
var aIndex = "key";
if (a[aIndex] && a[aIndex].x) {
a[aIndex].x; // number
}
var b = { key: {} };
var bIndex = "key";
if (b[bIndex].x) {
b[bIndex].x; // number
}
var c = [];
var cIndex = 1;
if (c[cIndex].x) {
c[cIndex].x; // number
}
@@ -0,0 +1,72 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty5.ts ===
const a: { key?: { x?: number } } = {};
>a : Symbol(a, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 0, 5))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 0, 10))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 0, 18))
const aIndex = "key";
>aIndex : Symbol(aIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 1, 5))
if (a[aIndex] && a[aIndex].x) {
>a : Symbol(a, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 0, 5))
>aIndex : Symbol(aIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 1, 5))
>a[aIndex].x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 0, 18))
>a : Symbol(a, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 0, 5))
>aIndex : Symbol(aIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 1, 5))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 0, 18))
a[aIndex].x // number
>a[aIndex].x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 0, 18))
>a : Symbol(a, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 0, 5))
>aIndex : Symbol(aIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 1, 5))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 0, 18))
}
const b: { key: { x?: number } } = { key: {} };
>b : Symbol(b, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 6, 5))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 6, 10))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 6, 17))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 6, 36))
const bIndex = "key";
>bIndex : Symbol(bIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 7, 5))
if (b[bIndex].x) {
>b[bIndex].x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 6, 17))
>b : Symbol(b, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 6, 5))
>bIndex : Symbol(bIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 7, 5))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 6, 17))
b[bIndex].x // number
>b[bIndex].x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 6, 17))
>b : Symbol(b, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 6, 5))
>bIndex : Symbol(bIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 7, 5))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 6, 17))
}
interface Foo {
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 10, 1))
x: number | undefined;
>x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 12, 15))
}
const c: Foo[] = [];
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 15, 5))
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 10, 1))
const cIndex = 1;
>cIndex : Symbol(cIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 16, 5))
if (c[cIndex].x) {
>c[cIndex].x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 12, 15))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 15, 5))
>cIndex : Symbol(cIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 16, 5))
>x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 12, 15))
c[cIndex].x // number
>c[cIndex].x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 12, 15))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 15, 5))
>cIndex : Symbol(cIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 16, 5))
>x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty5.ts, 12, 15))
}
@@ -0,0 +1,84 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty5.ts ===
const a: { key?: { x?: number } } = {};
>a : { key?: { x?: number | undefined; } | undefined; }
>key : { x?: number | undefined; } | undefined
>x : number | undefined
>{} : {}
const aIndex = "key";
>aIndex : "key"
>"key" : "key"
if (a[aIndex] && a[aIndex].x) {
>a[aIndex] && a[aIndex].x : number | undefined
>a[aIndex] : { x?: number | undefined; } | undefined
>a : { key?: { x?: number | undefined; } | undefined; }
>aIndex : "key"
>a[aIndex].x : number | undefined
>a[aIndex] : { x?: number | undefined; }
>a : { key?: { x?: number | undefined; } | undefined; }
>aIndex : "key"
>x : number | undefined
a[aIndex].x // number
>a[aIndex].x : number
>a[aIndex] : { x?: number | undefined; }
>a : { key?: { x?: number | undefined; } | undefined; }
>aIndex : "key"
>x : number
}
const b: { key: { x?: number } } = { key: {} };
>b : { key: { x?: number;}; }
>key : { x?: number | undefined; }
>x : number | undefined
>{ key: {} } : { key: {}; }
>key : {}
>{} : {}
const bIndex = "key";
>bIndex : "key"
>"key" : "key"
if (b[bIndex].x) {
>b[bIndex].x : number | undefined
>b[bIndex] : { x?: number | undefined; }
>b : { key: { x?: number | undefined; }; }
>bIndex : "key"
>x : number | undefined
b[bIndex].x // number
>b[bIndex].x : number
>b[bIndex] : { x?: number | undefined; }
>b : { key: { x?: number | undefined; }; }
>bIndex : "key"
>x : number
}
interface Foo {
x: number | undefined;
>x : number | undefined
}
const c: Foo[] = [];
>c : Foo[]
>[] : never[]
const cIndex = 1;
>cIndex : 1
>1 : 1
if (c[cIndex].x) {
>c[cIndex].x : number | undefined
>c[cIndex] : Foo
>c : Foo[]
>cIndex : 1
>x : number | undefined
c[cIndex].x // number
>c[cIndex].x : number
>c[cIndex] : Foo
>c : Foo[]
>cIndex : 1
>x : number
}
@@ -0,0 +1,37 @@
//// [typeGuardNarrowsIndexedAccessOfKnownProperty6.ts]
declare const aIndex: "key";
const a: { key?: { x?: number } } = {};
if (a[aIndex] && a[aIndex].x) {
a[aIndex].x // number
}
declare const bIndex: "key";
const b: { key: { x?: number } } = { key: {} };
if (b[bIndex].x) {
b[bIndex].x // number
}
declare const cIndex: 1;
interface Foo {
x: number | undefined;
}
const c: Foo[] = [];
if (c[cIndex].x) {
c[cIndex].x // number
}
//// [typeGuardNarrowsIndexedAccessOfKnownProperty6.js]
"use strict";
var a = {};
if (a[aIndex] && a[aIndex].x) {
a[aIndex].x; // number
}
var b = { key: {} };
if (b[bIndex].x) {
b[bIndex].x; // number
}
var c = [];
if (c[cIndex].x) {
c[cIndex].x; // number
}
@@ -0,0 +1,72 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty6.ts ===
declare const aIndex: "key";
>aIndex : Symbol(aIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 0, 13))
const a: { key?: { x?: number } } = {};
>a : Symbol(a, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 1, 5))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 1, 10))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 1, 18))
if (a[aIndex] && a[aIndex].x) {
>a : Symbol(a, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 1, 5))
>aIndex : Symbol(aIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 0, 13))
>a[aIndex].x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 1, 18))
>a : Symbol(a, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 1, 5))
>aIndex : Symbol(aIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 0, 13))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 1, 18))
a[aIndex].x // number
>a[aIndex].x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 1, 18))
>a : Symbol(a, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 1, 5))
>aIndex : Symbol(aIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 0, 13))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 1, 18))
}
declare const bIndex: "key";
>bIndex : Symbol(bIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 6, 13))
const b: { key: { x?: number } } = { key: {} };
>b : Symbol(b, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 7, 5))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 7, 10))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 7, 17))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 7, 36))
if (b[bIndex].x) {
>b[bIndex].x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 7, 17))
>b : Symbol(b, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 7, 5))
>bIndex : Symbol(bIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 6, 13))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 7, 17))
b[bIndex].x // number
>b[bIndex].x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 7, 17))
>b : Symbol(b, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 7, 5))
>bIndex : Symbol(bIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 6, 13))
>x : Symbol(x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 7, 17))
}
declare const cIndex: 1;
>cIndex : Symbol(cIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 12, 13))
interface Foo {
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 12, 24))
x: number | undefined;
>x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 13, 15))
}
const c: Foo[] = [];
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 16, 5))
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 12, 24))
if (c[cIndex].x) {
>c[cIndex].x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 13, 15))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 16, 5))
>cIndex : Symbol(cIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 12, 13))
>x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 13, 15))
c[cIndex].x // number
>c[cIndex].x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 13, 15))
>c : Symbol(c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 16, 5))
>cIndex : Symbol(cIndex, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 12, 13))
>x : Symbol(Foo.x, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty6.ts, 13, 15))
}
@@ -0,0 +1,81 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty6.ts ===
declare const aIndex: "key";
>aIndex : "key"
const a: { key?: { x?: number } } = {};
>a : { key?: { x?: number | undefined; } | undefined; }
>key : { x?: number | undefined; } | undefined
>x : number | undefined
>{} : {}
if (a[aIndex] && a[aIndex].x) {
>a[aIndex] && a[aIndex].x : number | undefined
>a[aIndex] : { x?: number | undefined; } | undefined
>a : { key?: { x?: number | undefined; } | undefined; }
>aIndex : "key"
>a[aIndex].x : number | undefined
>a[aIndex] : { x?: number | undefined; }
>a : { key?: { x?: number | undefined; } | undefined; }
>aIndex : "key"
>x : number | undefined
a[aIndex].x // number
>a[aIndex].x : number
>a[aIndex] : { x?: number | undefined; }
>a : { key?: { x?: number | undefined; } | undefined; }
>aIndex : "key"
>x : number
}
declare const bIndex: "key";
>bIndex : "key"
const b: { key: { x?: number } } = { key: {} };
>b : { key: { x?: number;}; }
>key : { x?: number | undefined; }
>x : number | undefined
>{ key: {} } : { key: {}; }
>key : {}
>{} : {}
if (b[bIndex].x) {
>b[bIndex].x : number | undefined
>b[bIndex] : { x?: number | undefined; }
>b : { key: { x?: number | undefined; }; }
>bIndex : "key"
>x : number | undefined
b[bIndex].x // number
>b[bIndex].x : number
>b[bIndex] : { x?: number | undefined; }
>b : { key: { x?: number | undefined; }; }
>bIndex : "key"
>x : number
}
declare const cIndex: 1;
>cIndex : 1
interface Foo {
x: number | undefined;
>x : number | undefined
}
const c: Foo[] = [];
>c : Foo[]
>[] : never[]
if (c[cIndex].x) {
>c[cIndex].x : number | undefined
>c[cIndex] : Foo
>c : Foo[]
>cIndex : 1
>x : number | undefined
c[cIndex].x // number
>c[cIndex].x : number
>c[cIndex] : Foo
>c : Foo[]
>cIndex : 1
>x : number
}
@@ -0,0 +1,25 @@
//// [typeGuardNarrowsIndexedAccessOfKnownProperty7.ts]
export namespace Foo {
export const key = Symbol();
}
export class C {
[Foo.key]: string;
constructor() {
this[Foo.key] = "hello";
}
}
//// [typeGuardNarrowsIndexedAccessOfKnownProperty7.js]
export var Foo;
(function (Foo) {
Foo.key = Symbol();
})(Foo || (Foo = {}));
export class C {
[Foo.key];
constructor() {
this[Foo.key] = "hello";
}
}
@@ -0,0 +1,27 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty7.ts ===
export namespace Foo {
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 0, 0))
export const key = Symbol();
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 1, 16))
>Symbol : Symbol(Symbol, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2019.symbol.d.ts, --, --))
}
export class C {
>C : Symbol(C, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 2, 1))
[Foo.key]: string;
>[Foo.key] : Symbol(C[Foo.key], Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 4, 16))
>Foo.key : Symbol(Foo.key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 1, 16))
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 0, 0))
>key : Symbol(Foo.key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 1, 16))
constructor() {
this[Foo.key] = "hello";
>this : Symbol(C, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 2, 1))
>Foo.key : Symbol(Foo.key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 1, 16))
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 0, 0))
>key : Symbol(Foo.key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty7.ts, 1, 16))
}
}
@@ -0,0 +1,31 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty7.ts ===
export namespace Foo {
>Foo : typeof Foo
export const key = Symbol();
>key : unique symbol
>Symbol() : unique symbol
>Symbol : SymbolConstructor
}
export class C {
>C : C
[Foo.key]: string;
>[Foo.key] : string
>Foo.key : unique symbol
>Foo : typeof Foo
>key : unique symbol
constructor() {
this[Foo.key] = "hello";
>this[Foo.key] = "hello" : "hello"
>this[Foo.key] : string
>this : this
>Foo.key : unique symbol
>Foo : typeof Foo
>key : unique symbol
>"hello" : "hello"
}
}
@@ -0,0 +1,26 @@
//// [tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty8.ts] ////
//// [a.ts]
export const key = "a";
//// [b.ts]
import * as a from "./a";
export class C {
[a.key]: string;
constructor() {
this[a.key] = "foo";
}
}
//// [a.js]
export const key = "a";
//// [b.js]
import * as a from "./a";
export class C {
[a.key];
constructor() {
this[a.key] = "foo";
}
}
@@ -0,0 +1,26 @@
=== tests/cases/compiler/a.ts ===
export const key = "a";
>key : Symbol(key, Decl(a.ts, 0, 12))
=== tests/cases/compiler/b.ts ===
import * as a from "./a";
>a : Symbol(a, Decl(b.ts, 0, 6))
export class C {
>C : Symbol(C, Decl(b.ts, 0, 25))
[a.key]: string;
>[a.key] : Symbol(C[a.key], Decl(b.ts, 1, 16))
>a.key : Symbol(a.key, Decl(a.ts, 0, 12))
>a : Symbol(a, Decl(b.ts, 0, 6))
>key : Symbol(a.key, Decl(a.ts, 0, 12))
constructor() {
this[a.key] = "foo";
>this : Symbol(C, Decl(b.ts, 0, 25))
>a.key : Symbol(a.key, Decl(a.ts, 0, 12))
>a : Symbol(a, Decl(b.ts, 0, 6))
>key : Symbol(a.key, Decl(a.ts, 0, 12))
}
}
@@ -0,0 +1,30 @@
=== tests/cases/compiler/a.ts ===
export const key = "a";
>key : "a"
>"a" : "a"
=== tests/cases/compiler/b.ts ===
import * as a from "./a";
>a : typeof a
export class C {
>C : C
[a.key]: string;
>[a.key] : string
>a.key : "a"
>a : typeof a
>key : "a"
constructor() {
this[a.key] = "foo";
>this[a.key] = "foo" : "foo"
>this[a.key] : string
>this : this
>a.key : "a"
>a : typeof a
>key : "a"
>"foo" : "foo"
}
}
@@ -0,0 +1,21 @@
tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty9.ts(5,13): error TS6133: 'c' is declared but its value is never read.
tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty9.ts(6,13): error TS6133: 'd' is declared but its value is never read.
==== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty9.ts (2 errors) ====
class C1 {
private a = "a"; // ok
private b = "b"; // ok
private c = "c"; // error unused prop
~
!!! error TS6133: 'c' is declared but its value is never read.
private d = "d"; // error unused prop
~
!!! error TS6133: 'd' is declared but its value is never read.
getValue(key: "a" | "b") {
return this[key];
}
}
@@ -0,0 +1,25 @@
//// [typeGuardNarrowsIndexedAccessOfKnownProperty9.ts]
class C1 {
private a = "a"; // ok
private b = "b"; // ok
private c = "c"; // error unused prop
private d = "d"; // error unused prop
getValue(key: "a" | "b") {
return this[key];
}
}
//// [typeGuardNarrowsIndexedAccessOfKnownProperty9.js]
"use strict";
class C1 {
a = "a"; // ok
b = "b"; // ok
c = "c"; // error unused prop
d = "d"; // error unused prop
getValue(key) {
return this[key];
}
}
@@ -0,0 +1,26 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty9.ts ===
class C1 {
>C1 : Symbol(C1, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty9.ts, 0, 0))
private a = "a"; // ok
>a : Symbol(C1.a, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty9.ts, 0, 10))
private b = "b"; // ok
>b : Symbol(C1.b, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty9.ts, 1, 20))
private c = "c"; // error unused prop
>c : Symbol(C1.c, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty9.ts, 2, 20))
private d = "d"; // error unused prop
>d : Symbol(C1.d, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty9.ts, 4, 20))
getValue(key: "a" | "b") {
>getValue : Symbol(C1.getValue, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty9.ts, 5, 20))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty9.ts, 7, 13))
return this[key];
>this : Symbol(C1, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty9.ts, 0, 0))
>key : Symbol(key, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty9.ts, 7, 13))
}
}
@@ -0,0 +1,31 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty9.ts ===
class C1 {
>C1 : C1
private a = "a"; // ok
>a : string
>"a" : "a"
private b = "b"; // ok
>b : string
>"b" : "b"
private c = "c"; // error unused prop
>c : string
>"c" : "c"
private d = "d"; // error unused prop
>d : string
>"d" : "d"
getValue(key: "a" | "b") {
>getValue : (key: "a" | "b") => string
>key : "a" | "b"
return this[key];
>this[key] : string
>this : this
>key : "a" | "b"
}
}
@@ -0,0 +1,9 @@
// @strict: true
const foo: { key?: number } = {};
const key = 'key' as const;
if (foo[key]) {
foo[key]; // number
foo.key; // number
}
@@ -0,0 +1,10 @@
// @strict: true
type Foo = (number | undefined)[] | undefined;
const foo: Foo = [1, 2, 3];
const index = 1;
if (foo !== undefined && foo[index] !== undefined && foo[index] >= 0) {
foo[index] // number
}
@@ -0,0 +1,15 @@
// @strict: true
class Foo {
x: number | undefined;
constructor() {
this.x = 5;
this.x; // number
this['x']; // number
const key = 'x';
this[key]; // number
}
}
@@ -0,0 +1,22 @@
// @strict: true
const a: { key?: { x?: number } } = {};
const aIndex = "key";
if (a[aIndex] && a[aIndex].x) {
a[aIndex].x // number
}
const b: { key: { x?: number } } = { key: {} };
const bIndex = "key";
if (b[bIndex].x) {
b[bIndex].x // number
}
interface Foo {
x: number | undefined;
}
const c: Foo[] = [];
const cIndex = 1;
if (c[cIndex].x) {
c[cIndex].x // number
}
@@ -0,0 +1,22 @@
// @strict: true
declare const aIndex: "key";
const a: { key?: { x?: number } } = {};
if (a[aIndex] && a[aIndex].x) {
a[aIndex].x // number
}
declare const bIndex: "key";
const b: { key: { x?: number } } = { key: {} };
if (b[bIndex].x) {
b[bIndex].x // number
}
declare const cIndex: 1;
interface Foo {
x: number | undefined;
}
const c: Foo[] = [];
if (c[cIndex].x) {
c[cIndex].x // number
}
@@ -0,0 +1,14 @@
// @strict: true
// @target: esnext
export namespace Foo {
export const key = Symbol();
}
export class C {
[Foo.key]: string;
constructor() {
this[Foo.key] = "hello";
}
}
@@ -0,0 +1,15 @@
// @strict: true
// @target: esnext
// @filename: ./a.ts
export const key = "a";
// @filename: ./b.ts
import * as a from "./a";
export class C {
[a.key]: string;
constructor() {
this[a.key] = "foo";
}
}
@@ -0,0 +1,15 @@
// @noUnusedLocals: true
// @strict: true
// @target: esnext
class C1 {
private a = "a"; // ok
private b = "b"; // ok
private c = "c"; // error unused prop
private d = "d"; // error unused prop
getValue(key: "a" | "b") {
return this[key];
}
}
@@ -1,5 +1,5 @@
// @strict: true
// @target:es2015
// @target: es2015
// @declaration: true
// Properties with non-undefined types require initialization
@@ -135,3 +135,18 @@ class C11 {
this.#b = someValue();
}
}
const a = 'a';
const b = Symbol();
class C12 {
[a]: number;
[b]: number;
['c']: number;
constructor() {
this[a] = 1;
this[b] = 1;
this['c'] = 1;
}
}