From 2e5a39a3cebfcd4a712bd1a72ab9962acbe75d3d Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Mon, 8 Oct 2018 16:35:03 -0700 Subject: [PATCH] Error when indexing out of bounds in a tuple or union of tuples --- src/compiler/checker.ts | 14 ++++++-------- src/compiler/diagnosticMessages.json | 4 ---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3b2c4efc662..33d23bd11ee 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9312,7 +9312,12 @@ namespace ts { propType; } if (everyType(objectType, isTupleType) && isNumericLiteralName(propName) && +propName >= 0) { - return mapType(objectType, t => getRestTypeOfTupleType(t) || undefinedType); + const restType = mapType(objectType, t => getRestTypeOfTupleType(t) || undefinedType); + if (restType === undefinedType && accessNode) { + const indexNode = accessNode.kind === SyntaxKind.ElementAccessExpression ? accessNode.argumentExpression : accessNode.indexType; + error(indexNode, Diagnostics.Property_0_does_not_exist_on_type_1, unescapeLeadingUnderscores(propName), typeToString(objectType)); + } + return restType; } } if (!(indexType.flags & TypeFlags.Nullable) && isTypeAssignableToKind(indexType, TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.ESSymbolLike)) { @@ -18964,13 +18969,6 @@ namespace ts { error(indexExpression, Diagnostics.A_const_enum_member_can_only_be_accessed_using_a_string_literal); return errorType; } - if (isTupleType(objectType) && !objectType.target.hasRestElement && isNumericLiteral(indexExpression)) { - const index = +indexExpression.text; - const length = getTypeReferenceArity(objectType); - if (index >= length) { - error(indexExpression, Diagnostics.Index_0_is_out_of_bounds_in_tuple_of_length_1, index, length); - } - } return checkIndexedAccessIndexType(getIndexedAccessType(objectType, isForInVariableForNumericPropertyNames(indexExpression) ? numberType : indexType, node), node); } diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index ce1ccf17145..01d95bc2b85 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -2481,10 +2481,6 @@ "category": "Error", "code": 2732 }, - "Index '{0}' is out-of-bounds in tuple of length {1}.": { - "category": "Error", - "code": 2733 - }, "It is highly likely that you are missing a semicolon.": { "category": "Error", "code": 2734