diff --git a/internal/fourslash/tests/completionsInJsxTagDifferentSpreadElementTypes_test.go b/internal/fourslash/tests/completionsInJsxTagDifferentSpreadElementTypes_test.go
new file mode 100644
index 0000000000..adf2889929
--- /dev/null
+++ b/internal/fourslash/tests/completionsInJsxTagDifferentSpreadElementTypes_test.go
@@ -0,0 +1,64 @@
+package fourslash_test
+
+import (
+ "testing"
+
+ "github.com/microsoft/typescript-go/internal/fourslash"
+ "github.com/microsoft/typescript-go/internal/testutil"
+)
+
+func TestCompletionsInJsxTagDifferentSpreadElementTypes(t *testing.T) {
+ t.Parallel()
+
+ defer testutil.RecoverAndFail(t, "Panic on fourslash test")
+ const content = `
+// @Filename: /completionsWithDifferentSpreadTypes.tsx
+// @strict: true
+
+// A reasonable type to spread.
+export function ComponentObjectX(props: { x: string }) {
+ return ;
+}
+
+// A questionable but valid type to spread.
+export function ComponentObjectXOrY(props: { x: string } | { y: string }) {
+ return ;
+}
+
+// A very unexpected type to spread (a union containing a primitive).
+export function ComponentNumberOrObjectX(props: number | { x: string }) {
+ return ;
+}
+
+// Very unexpected, but still structured (union) types.
+// 'boolean' is 'true | false' and an optional 'null' is really 'null | undefined'.
+export function ComponentBoolean(props: boolean) {
+ return ;
+}
+export function ComponentOptionalNull(props?: null) {
+ return ;
+}
+
+// Primitive types (non-structured).
+export function ComponentAny(props: any) {
+ return ;
+}
+export function ComponentUnknown(props: unknown) {
+ return ;
+}
+export function ComponentNever(props: never) {
+ return ;
+}
+export function ComponentUndefined(props: undefined) {
+ return ;
+}
+export function ComponentNumber(props: number) {
+ return ;
+}
+`
+ f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content)
+ defer done()
+ f.GoToEachMarker(t, nil, func(marker *fourslash.Marker, index int) {
+ f.VerifyCompletions(t, marker, nil)
+ })
+}
diff --git a/internal/ls/completions.go b/internal/ls/completions.go
index 07cc863e55..bdf7deae13 100644
--- a/internal/ls/completions.go
+++ b/internal/ls/completions.go
@@ -4079,7 +4079,7 @@ func setMemberDeclaredBySpreadAssignment(declaration *ast.Node, members *collect
t = typeChecker.GetTypeOfSymbolAtLocation(symbol, expression)
}
var properties []*ast.Symbol
- if t != nil {
+ if t != nil && t.Flags()&checker.TypeFlagsStructuredType != 0 {
properties = t.AsStructuredType().Properties()
}
for _, property := range properties {