diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a7a0727e7d8..30b51d561ac 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -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 { diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index e1570dd8fd5..7e1a577ae0c 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -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 }, diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 56b958bcf3b..37d69ec340f 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4842,6 +4842,7 @@ namespace Parser { // Skip modifiers parseModifiers(/*allowDecorators*/ false); } + parseOptional(SyntaxKind.DotDotDotToken); if (isIdentifier() || token() === SyntaxKind.ThisKeyword) { nextToken(); return true;