@@ -9104,7 +9104,7 @@ namespace ts {
9104
9104
function createTupleType(elementTypes: ReadonlyArray<Type>, minLength = elementTypes.length, hasRestElement = false, readonly = false, associatedNames?: __String[]) {
9105
9105
const arity = elementTypes.length;
9106
9106
if (arity === 1 && hasRestElement) {
9107
- return createArrayType(elementTypes[0]);
9107
+ return createArrayType(elementTypes[0], readonly );
9108
9108
}
9109
9109
const tupleType = getTupleTypeOfArity(arity, minLength, arity > 0 && hasRestElement, readonly, associatedNames);
9110
9110
return elementTypes.length ? createTypeReference(tupleType, elementTypes) : tupleType;
@@ -21158,9 +21158,34 @@ namespace ts {
21158
21158
return checkAssertionWorker(node, node.type, node.expression);
21159
21159
}
21160
21160
21161
+ function isValidConstAssertionArgument(node: Node): boolean {
21162
+ switch (node.kind) {
21163
+ case SyntaxKind.StringLiteral:
21164
+ case SyntaxKind.NoSubstitutionTemplateLiteral:
21165
+ case SyntaxKind.NumericLiteral:
21166
+ case SyntaxKind.BigIntLiteral:
21167
+ case SyntaxKind.TrueKeyword:
21168
+ case SyntaxKind.FalseKeyword:
21169
+ case SyntaxKind.ArrayLiteralExpression:
21170
+ case SyntaxKind.ObjectLiteralExpression:
21171
+ return true;
21172
+ case SyntaxKind.ParenthesizedExpression:
21173
+ return isValidConstAssertionArgument((<ParenthesizedExpression>node).expression);
21174
+ case SyntaxKind.PrefixUnaryExpression:
21175
+ const op = (<PrefixUnaryExpression>node).operator;
21176
+ const arg = (<PrefixUnaryExpression>node).operand;
21177
+ return op === SyntaxKind.MinusToken && (arg.kind === SyntaxKind.NumericLiteral || arg.kind === SyntaxKind.BigIntLiteral) ||
21178
+ op === SyntaxKind.PlusToken && arg.kind === SyntaxKind.NumericLiteral;
21179
+ }
21180
+ return false;
21181
+ }
21182
+
21161
21183
function checkAssertionWorker(errNode: Node, type: TypeNode, expression: UnaryExpression | Expression, checkMode?: CheckMode) {
21162
21184
let exprType = checkExpression(expression, checkMode);
21163
21185
if (isConstTypeReference(type)) {
21186
+ if (!isValidConstAssertionArgument(expression)) {
21187
+ error(expression, Diagnostics.A_const_assertion_can_only_be_applied_to_a_string_number_boolean_array_or_object_literal);
21188
+ }
21164
21189
return getRegularTypeOfLiteralType(exprType);
21165
21190
}
21166
21191
checkSourceElement(type);
0 commit comments