diff --git a/tests/baselines/reference/discriminatedUnionInference.js b/tests/baselines/reference/discriminatedUnionInference.js
new file mode 100644
index 00000000000..df45edeb237
--- /dev/null
+++ b/tests/baselines/reference/discriminatedUnionInference.js
@@ -0,0 +1,27 @@
+//// [discriminatedUnionInference.ts]
+// Repro from #28862
+
+type Foo = { type: "foo", (): A[] };
+type Bar = { type: "bar", (): A };
+
+type FooBar = Foo | Bar;
+
+type InferA = T extends FooBar ? A : never;
+
+type FooA = InferA>; // number
+
+// Repro from #28862
+
+type Item = { kind: 'a', data: T } | { kind: 'b', data: T[] };
+
+declare function foo(item: Item): T;
+
+let x1 = foo({ kind: 'a', data: 42 }); // number
+let x2 = foo({ kind: 'b', data: [1, 2] }); // number
+
+
+//// [discriminatedUnionInference.js]
+"use strict";
+// Repro from #28862
+var x1 = foo({ kind: 'a', data: 42 }); // number
+var x2 = foo({ kind: 'b', data: [1, 2] }); // number
diff --git a/tests/baselines/reference/discriminatedUnionInference.symbols b/tests/baselines/reference/discriminatedUnionInference.symbols
new file mode 100644
index 00000000000..d8643b7ba6a
--- /dev/null
+++ b/tests/baselines/reference/discriminatedUnionInference.symbols
@@ -0,0 +1,68 @@
+=== tests/cases/conformance/types/typeRelationships/typeInference/discriminatedUnionInference.ts ===
+// Repro from #28862
+
+type Foo = { type: "foo", (): A[] };
+>Foo : Symbol(Foo, Decl(discriminatedUnionInference.ts, 0, 0))
+>A : Symbol(A, Decl(discriminatedUnionInference.ts, 2, 9))
+>type : Symbol(type, Decl(discriminatedUnionInference.ts, 2, 15))
+>A : Symbol(A, Decl(discriminatedUnionInference.ts, 2, 9))
+
+type Bar = { type: "bar", (): A };
+>Bar : Symbol(Bar, Decl(discriminatedUnionInference.ts, 2, 39))
+>A : Symbol(A, Decl(discriminatedUnionInference.ts, 3, 9))
+>type : Symbol(type, Decl(discriminatedUnionInference.ts, 3, 15))
+>A : Symbol(A, Decl(discriminatedUnionInference.ts, 3, 9))
+
+type FooBar = Foo | Bar;
+>FooBar : Symbol(FooBar, Decl(discriminatedUnionInference.ts, 3, 37))
+>A : Symbol(A, Decl(discriminatedUnionInference.ts, 5, 12))
+>Foo : Symbol(Foo, Decl(discriminatedUnionInference.ts, 0, 0))
+>A : Symbol(A, Decl(discriminatedUnionInference.ts, 5, 12))
+>Bar : Symbol(Bar, Decl(discriminatedUnionInference.ts, 2, 39))
+>A : Symbol(A, Decl(discriminatedUnionInference.ts, 5, 12))
+
+type InferA = T extends FooBar ? A : never;
+>InferA : Symbol(InferA, Decl(discriminatedUnionInference.ts, 5, 33))
+>T : Symbol(T, Decl(discriminatedUnionInference.ts, 7, 12))
+>T : Symbol(T, Decl(discriminatedUnionInference.ts, 7, 12))
+>FooBar : Symbol(FooBar, Decl(discriminatedUnionInference.ts, 3, 37))
+>A : Symbol(A, Decl(discriminatedUnionInference.ts, 7, 39))
+>A : Symbol(A, Decl(discriminatedUnionInference.ts, 7, 39))
+
+type FooA = InferA>; // number
+>FooA : Symbol(FooA, Decl(discriminatedUnionInference.ts, 7, 55))
+>InferA : Symbol(InferA, Decl(discriminatedUnionInference.ts, 5, 33))
+>Foo : Symbol(Foo, Decl(discriminatedUnionInference.ts, 0, 0))
+
+// Repro from #28862
+
+type Item = { kind: 'a', data: T } | { kind: 'b', data: T[] };
+>Item : Symbol(Item, Decl(discriminatedUnionInference.ts, 9, 32))
+>T : Symbol(T, Decl(discriminatedUnionInference.ts, 13, 10))
+>kind : Symbol(kind, Decl(discriminatedUnionInference.ts, 13, 16))
+>data : Symbol(data, Decl(discriminatedUnionInference.ts, 13, 27))
+>T : Symbol(T, Decl(discriminatedUnionInference.ts, 13, 10))
+>kind : Symbol(kind, Decl(discriminatedUnionInference.ts, 13, 41))
+>data : Symbol(data, Decl(discriminatedUnionInference.ts, 13, 52))
+>T : Symbol(T, Decl(discriminatedUnionInference.ts, 13, 10))
+
+declare function foo(item: Item): T;
+>foo : Symbol(foo, Decl(discriminatedUnionInference.ts, 13, 65))
+>T : Symbol(T, Decl(discriminatedUnionInference.ts, 15, 21))
+>item : Symbol(item, Decl(discriminatedUnionInference.ts, 15, 24))
+>Item : Symbol(Item, Decl(discriminatedUnionInference.ts, 9, 32))
+>T : Symbol(T, Decl(discriminatedUnionInference.ts, 15, 21))
+>T : Symbol(T, Decl(discriminatedUnionInference.ts, 15, 21))
+
+let x1 = foo({ kind: 'a', data: 42 }); // number
+>x1 : Symbol(x1, Decl(discriminatedUnionInference.ts, 17, 3))
+>foo : Symbol(foo, Decl(discriminatedUnionInference.ts, 13, 65))
+>kind : Symbol(kind, Decl(discriminatedUnionInference.ts, 17, 14))
+>data : Symbol(data, Decl(discriminatedUnionInference.ts, 17, 25))
+
+let x2 = foo({ kind: 'b', data: [1, 2] }); // number
+>x2 : Symbol(x2, Decl(discriminatedUnionInference.ts, 18, 3))
+>foo : Symbol(foo, Decl(discriminatedUnionInference.ts, 13, 65))
+>kind : Symbol(kind, Decl(discriminatedUnionInference.ts, 18, 14))
+>data : Symbol(data, Decl(discriminatedUnionInference.ts, 18, 25))
+
diff --git a/tests/baselines/reference/discriminatedUnionInference.types b/tests/baselines/reference/discriminatedUnionInference.types
new file mode 100644
index 00000000000..65e3db1510a
--- /dev/null
+++ b/tests/baselines/reference/discriminatedUnionInference.types
@@ -0,0 +1,55 @@
+=== tests/cases/conformance/types/typeRelationships/typeInference/discriminatedUnionInference.ts ===
+// Repro from #28862
+
+type Foo = { type: "foo", (): A[] };
+>Foo : Foo
+>type : "foo"
+
+type Bar = { type: "bar", (): A };
+>Bar : Bar
+>type : "bar"
+
+type FooBar = Foo | Bar;
+>FooBar : FooBar
+
+type InferA = T extends FooBar ? A : never;
+>InferA : InferA
+
+type FooA = InferA>; // number
+>FooA : number
+
+// Repro from #28862
+
+type Item = { kind: 'a', data: T } | { kind: 'b', data: T[] };
+>Item : Item
+>kind : "a"
+>data : T
+>kind : "b"
+>data : T[]
+
+declare function foo(item: Item): T;
+>foo : (item: Item) => T
+>item : Item
+
+let x1 = foo({ kind: 'a', data: 42 }); // number
+>x1 : number
+>foo({ kind: 'a', data: 42 }) : number
+>foo : (item: Item) => T
+>{ kind: 'a', data: 42 } : { kind: "a"; data: number; }
+>kind : "a"
+>'a' : "a"
+>data : number
+>42 : 42
+
+let x2 = foo({ kind: 'b', data: [1, 2] }); // number
+>x2 : number
+>foo({ kind: 'b', data: [1, 2] }) : number
+>foo : (item: Item) => T
+>{ kind: 'b', data: [1, 2] } : { kind: "b"; data: number[]; }
+>kind : "b"
+>'b' : "b"
+>data : number[]
+>[1, 2] : number[]
+>1 : 1
+>2 : 2
+