Skip to content

Commit 1175676

Browse files
committed
Cache expression type
1 parent 08285ab commit 1175676

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34516,13 +34516,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3451634516

3451734517
function checkAssertionWorker(node: JSDocTypeAssertion | AssertionExpression, checkMode: CheckMode | undefined) {
3451834518
const { type, expression } = getAssertionTypeAndExpression(node);
34519-
const exprType = checkExpression(expression, checkMode);
3452034519
if (isConstTypeReference(type)) {
3452134520
if (!isValidConstAssertionArgument(expression)) {
3452234521
error(expression, Diagnostics.A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals);
3452334522
}
34524-
return getRegularTypeOfLiteralType(exprType);
34523+
return getRegularTypeOfLiteralType(checkExpression(expression, checkMode));
3452534524
}
34525+
const links = getNodeLinks(node);
34526+
links.assertionExpressionType = checkExpression(expression, checkMode);
3452634527
checkSourceElement(type);
3452734528
checkNodeDeferred(node);
3452834529
return getTypeFromTypeNode(type);
@@ -34547,9 +34548,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3454734548
}
3454834549

3454934550
function checkAssertionDeferred(node: JSDocTypeAssertion | AssertionExpression) {
34550-
const { type, expression } = getAssertionTypeAndExpression(node);
34551+
const { type } = getAssertionTypeAndExpression(node);
3455134552
const errNode = isParenthesizedExpression(node) ? type : node;
34552-
const exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(checkExpression(expression)));
34553+
const exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(getNodeLinks(node).assertionExpressionType!));
3455334554
const targetType = getTypeFromTypeNode(type);
3455434555
if (!isErrorType(targetType)) {
3455534556
addLazyDiagnostic(() => {

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6060,6 +6060,7 @@ export interface NodeLinks {
60606060
spreadIndices?: { first: number | undefined, last: number | undefined }; // Indices of first and last spread elements in array literal
60616061
parameterInitializerContainsUndefined?: boolean; // True if this is a parameter declaration whose type annotation contains "undefined".
60626062
fakeScopeForSignatureDeclaration?: boolean; // True if this is a fake scope injected into an enclosing declaration chain.
6063+
assertionExpressionType?: Type; // Cached type of the expression of a type assertion
60636064
}
60646065

60656066
/** @internal */

0 commit comments

Comments
 (0)