diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index 467b91cbe4d4b..97fdc0aa0537f 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -28781,7 +28781,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
spread = getSpreadType(spread, createJsxAttributesType(), attributes.symbol, objectFlags, /*readonly*/ false);
attributesTable = createSymbolTable();
}
- const exprType = getReducedType(checkExpressionCached(attributeDecl.expression, checkMode));
+ const exprType = getReducedType(checkExpression(attributeDecl.expression));
if (isTypeAny(exprType)) {
hasSpreadAnyType = true;
}
diff --git a/tests/baselines/reference/jsxGenericComponentWithSpreadingResultOfGenericFunction.symbols b/tests/baselines/reference/jsxGenericComponentWithSpreadingResultOfGenericFunction.symbols
new file mode 100644
index 0000000000000..9a98bcaf939b1
--- /dev/null
+++ b/tests/baselines/reference/jsxGenericComponentWithSpreadingResultOfGenericFunction.symbols
@@ -0,0 +1,47 @@
+=== tests/cases/compiler/jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx ===
+///
+
+// repro #51577
+
+declare function omit(names: readonly K[], obj: T): Omit;
+>omit : Symbol(omit, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 0, 0), Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 84))
+>T : Symbol(T, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 22))
+>K : Symbol(K, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 24))
+>names : Symbol(names, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 43))
+>K : Symbol(K, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 24))
+>obj : Symbol(obj, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 63))
+>T : Symbol(T, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 22))
+>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
+>T : Symbol(T, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 22))
+>K : Symbol(K, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 24))
+
+declare function omit(names: readonly K[]): (obj: T) => Omit;
+>omit : Symbol(omit, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 0, 0), Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 84))
+>K : Symbol(K, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 5, 22))
+>names : Symbol(names, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 5, 40))
+>K : Symbol(K, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 5, 22))
+>T : Symbol(T, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 5, 63))
+>obj : Symbol(obj, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 5, 66))
+>T : Symbol(T, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 5, 63))
+>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
+>T : Symbol(T, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 5, 63))
+>K : Symbol(K, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 5, 22))
+
+declare const otherProps: { bar: string, qwe: boolean }
+>otherProps : Symbol(otherProps, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 7, 13))
+>bar : Symbol(bar, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 7, 27))
+>qwe : Symbol(qwe, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 7, 40))
+
+declare function GenericComponent(props: T): null
+>GenericComponent : Symbol(GenericComponent, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 7, 55))
+>T : Symbol(T, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 9, 34))
+>props : Symbol(props, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 9, 37))
+>T : Symbol(T, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 9, 34))
+
+; // no error
+>GenericComponent : Symbol(GenericComponent, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 7, 55))
+>omit : Symbol(omit, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 0, 0), Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 4, 84))
+>otherProps : Symbol(otherProps, Decl(jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx, 7, 13))
+
+
+
diff --git a/tests/baselines/reference/jsxGenericComponentWithSpreadingResultOfGenericFunction.types b/tests/baselines/reference/jsxGenericComponentWithSpreadingResultOfGenericFunction.types
new file mode 100644
index 0000000000000..7d6093bcd9efb
--- /dev/null
+++ b/tests/baselines/reference/jsxGenericComponentWithSpreadingResultOfGenericFunction.types
@@ -0,0 +1,36 @@
+=== tests/cases/compiler/jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx ===
+///
+
+// repro #51577
+
+declare function omit(names: readonly K[], obj: T): Omit;
+>omit : { (names: readonly K[], obj: T): Omit; (names: readonly K[]): (obj: T) => Omit; }
+>names : readonly K[]
+>obj : T
+
+declare function omit(names: readonly K[]): (obj: T) => Omit;
+>omit : { (names: readonly K[], obj: T): Omit; (names: readonly K[]): (obj: T) => Omit; }
+>names : readonly K[]
+>obj : T
+
+declare const otherProps: { bar: string, qwe: boolean }
+>otherProps : { bar: string; qwe: boolean; }
+>bar : string
+>qwe : boolean
+
+declare function GenericComponent(props: T): null
+>GenericComponent : (props: T) => null
+>props : T
+>null : null
+
+; // no error
+> : JSX.Element
+>GenericComponent : (props: T) => null
+>omit(['bar'], otherProps) : Omit<{ bar: string; qwe: boolean; }, "bar">
+>omit : { (names: readonly K[], obj: T): Omit; (names: readonly K[]): (obj: T) => Omit; }
+>['bar'] : "bar"[]
+>'bar' : "bar"
+>otherProps : { bar: string; qwe: boolean; }
+
+
+
diff --git a/tests/cases/compiler/jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx b/tests/cases/compiler/jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx
new file mode 100644
index 0000000000000..abb94add5e62a
--- /dev/null
+++ b/tests/cases/compiler/jsxGenericComponentWithSpreadingResultOfGenericFunction.tsx
@@ -0,0 +1,18 @@
+// @strict: true
+// @noEmit: true
+// @jsx: preserve
+
+///
+
+// repro #51577
+
+declare function omit(names: readonly K[], obj: T): Omit;
+declare function omit(names: readonly K[]): (obj: T) => Omit;
+
+declare const otherProps: { bar: string, qwe: boolean }
+
+declare function GenericComponent(props: T): null
+
+; // no error
+
+