Use comparable relation for check + fix parsing issue

This commit is contained in:
Anders Hejlsberg
2024-06-16 09:24:06 +02:00
parent 0288e180f4
commit fc9c454ccf
3 changed files with 8 additions and 7 deletions
+6 -6
View File
@@ -40550,12 +40550,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
error(node.name, Diagnostics.constructor_cannot_be_used_as_a_parameter_property_name);
}
}
if (hasSyntacticModifier(node, ModifierFlags.Deferred)) {
const funcType = node.dotDotDotToken ? createArrayType(globalFunctionType, /*readonly*/ true) : globalFunctionType;
if (!isTypeAssignableTo(getTypeOfSymbol(node.symbol), funcType)) {
error(node, Diagnostics.A_deferred_parameter_must_have_a_function_type);
}
}
if (!node.initializer && isOptionalDeclaration(node) && isBindingPattern(node.name) && (func as FunctionLikeDeclaration).body) {
error(node, Diagnostics.A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature);
}
@@ -40579,6 +40573,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
if (node.dotDotDotToken && !isBindingPattern(node.name) && !isTypeAssignableTo(getReducedType(getTypeOfSymbol(node.symbol)), anyReadonlyArrayType)) {
error(node, Diagnostics.A_rest_parameter_must_be_of_an_array_type);
}
if (hasSyntacticModifier(node, ModifierFlags.Deferred)) {
const funcType = node.dotDotDotToken ? createArrayType(globalFunctionType, /*readonly*/ true) : globalFunctionType;
if (!areTypesComparable(getTypeOfSymbol(node.symbol), funcType)) {
error(node, Diagnostics.A_deferred_parameter_must_have_a_type_that_permits_functions);
}
}
}
function checkTypePredicate(node: TypePredicateNode): void {
+1 -1
View File
@@ -3915,7 +3915,7 @@
"category": "Error",
"code": 2868
},
"A 'deferred' parameter must have a function type.": {
"A 'deferred' parameter must have a type that permits functions.": {
"category": "Error",
"code": 2869
},
+1
View File
@@ -4842,6 +4842,7 @@ namespace Parser {
// Skip modifiers
parseModifiers(/*allowDecorators*/ false);
}
parseOptional(SyntaxKind.DotDotDotToken);
if (isIdentifier() || token() === SyntaxKind.ThisKeyword) {
nextToken();
return true;