diff --git a/tests/baselines/reference/conditionalTypes2.errors.txt b/tests/baselines/reference/conditionalTypes2.errors.txt index 322cbe1e7bb..a1a23b6da18 100644 --- a/tests/baselines/reference/conditionalTypes2.errors.txt +++ b/tests/baselines/reference/conditionalTypes2.errors.txt @@ -212,4 +212,38 @@ tests/cases/conformance/types/conditional/conditionalTypes2.ts(75,12): error TS2 type T1 = MaybeTrue<{ b: false }>; // "no" type T2 = MaybeTrue<{ b: true }>; // "yes" type T3 = MaybeTrue<{ b: boolean }>; // "yes" + + // Repro from #28824 + + type Union = 'a' | 'b'; + type Product = { f1: A, f2: B}; + type ProductUnion = Product<'a', 0> | Product<'b', 1>; + + // {a: "b"; b: "a"} + type UnionComplement = { + [K in Union]: Exclude + }; + type UCA = UnionComplement['a']; + type UCB = UnionComplement['b']; + + // {a: "a"; b: "b"} + type UnionComplementComplement = { + [K in Union]: Exclude> + }; + type UCCA = UnionComplementComplement['a']; + type UCCB = UnionComplementComplement['b']; + + // {a: Product<'b', 1>; b: Product<'a', 0>} + type ProductComplement = { + [K in Union]: Exclude + }; + type PCA = ProductComplement['a']; + type PCB = ProductComplement['b']; + + // {a: Product<'a', 0>; b: Product<'b', 1>} + type ProductComplementComplement = { + [K in Union]: Exclude> + }; + type PCCA = ProductComplementComplement['a']; + type PCCB = ProductComplementComplement['b']; \ No newline at end of file diff --git a/tests/baselines/reference/conditionalTypes2.js b/tests/baselines/reference/conditionalTypes2.js index 02581ab0015..4f4f35e821a 100644 --- a/tests/baselines/reference/conditionalTypes2.js +++ b/tests/baselines/reference/conditionalTypes2.js @@ -154,6 +154,40 @@ type T0 = MaybeTrue<{ b: never }> // "no" type T1 = MaybeTrue<{ b: false }>; // "no" type T2 = MaybeTrue<{ b: true }>; // "yes" type T3 = MaybeTrue<{ b: boolean }>; // "yes" + +// Repro from #28824 + +type Union = 'a' | 'b'; +type Product = { f1: A, f2: B}; +type ProductUnion = Product<'a', 0> | Product<'b', 1>; + +// {a: "b"; b: "a"} +type UnionComplement = { + [K in Union]: Exclude +}; +type UCA = UnionComplement['a']; +type UCB = UnionComplement['b']; + +// {a: "a"; b: "b"} +type UnionComplementComplement = { + [K in Union]: Exclude> +}; +type UCCA = UnionComplementComplement['a']; +type UCCB = UnionComplementComplement['b']; + +// {a: Product<'b', 1>; b: Product<'a', 0>} +type ProductComplement = { + [K in Union]: Exclude +}; +type PCA = ProductComplement['a']; +type PCB = ProductComplement['b']; + +// {a: Product<'a', 0>; b: Product<'b', 1>} +type ProductComplementComplement = { + [K in Union]: Exclude> +}; +type PCCA = ProductComplementComplement['a']; +type PCCB = ProductComplementComplement['b']; //// [conditionalTypes2.js] @@ -328,3 +362,33 @@ declare type T2 = MaybeTrue<{ declare type T3 = MaybeTrue<{ b: boolean; }>; +declare type Union = 'a' | 'b'; +declare type Product = { + f1: A; + f2: B; +}; +declare type ProductUnion = Product<'a', 0> | Product<'b', 1>; +declare type UnionComplement = { + [K in Union]: Exclude; +}; +declare type UCA = UnionComplement['a']; +declare type UCB = UnionComplement['b']; +declare type UnionComplementComplement = { + [K in Union]: Exclude>; +}; +declare type UCCA = UnionComplementComplement['a']; +declare type UCCB = UnionComplementComplement['b']; +declare type ProductComplement = { + [K in Union]: Exclude; +}; +declare type PCA = ProductComplement['a']; +declare type PCB = ProductComplement['b']; +declare type ProductComplementComplement = { + [K in Union]: Exclude>; +}; +declare type PCCA = ProductComplementComplement['a']; +declare type PCCB = ProductComplementComplement['b']; diff --git a/tests/baselines/reference/conditionalTypes2.symbols b/tests/baselines/reference/conditionalTypes2.symbols index b9098616f0f..b164d26e450 100644 --- a/tests/baselines/reference/conditionalTypes2.symbols +++ b/tests/baselines/reference/conditionalTypes2.symbols @@ -579,3 +579,109 @@ type T3 = MaybeTrue<{ b: boolean }>; // "yes" >MaybeTrue : Symbol(MaybeTrue, Decl(conditionalTypes2.ts, 145, 63)) >b : Symbol(b, Decl(conditionalTypes2.ts, 154, 21)) +// Repro from #28824 + +type Union = 'a' | 'b'; +>Union : Symbol(Union, Decl(conditionalTypes2.ts, 154, 36)) + +type Product = { f1: A, f2: B}; +>Product : Symbol(Product, Decl(conditionalTypes2.ts, 158, 23)) +>A : Symbol(A, Decl(conditionalTypes2.ts, 159, 13)) +>Union : Symbol(Union, Decl(conditionalTypes2.ts, 154, 36)) +>B : Symbol(B, Decl(conditionalTypes2.ts, 159, 29)) +>f1 : Symbol(f1, Decl(conditionalTypes2.ts, 159, 36)) +>A : Symbol(A, Decl(conditionalTypes2.ts, 159, 13)) +>f2 : Symbol(f2, Decl(conditionalTypes2.ts, 159, 43)) +>B : Symbol(B, Decl(conditionalTypes2.ts, 159, 29)) + +type ProductUnion = Product<'a', 0> | Product<'b', 1>; +>ProductUnion : Symbol(ProductUnion, Decl(conditionalTypes2.ts, 159, 51)) +>Product : Symbol(Product, Decl(conditionalTypes2.ts, 158, 23)) +>Product : Symbol(Product, Decl(conditionalTypes2.ts, 158, 23)) + +// {a: "b"; b: "a"} +type UnionComplement = { +>UnionComplement : Symbol(UnionComplement, Decl(conditionalTypes2.ts, 160, 54)) + + [K in Union]: Exclude +>K : Symbol(K, Decl(conditionalTypes2.ts, 164, 3)) +>Union : Symbol(Union, Decl(conditionalTypes2.ts, 154, 36)) +>Exclude : Symbol(Exclude, Decl(lib.es5.d.ts, --, --)) +>Union : Symbol(Union, Decl(conditionalTypes2.ts, 154, 36)) +>K : Symbol(K, Decl(conditionalTypes2.ts, 164, 3)) + +}; +type UCA = UnionComplement['a']; +>UCA : Symbol(UCA, Decl(conditionalTypes2.ts, 165, 2)) +>UnionComplement : Symbol(UnionComplement, Decl(conditionalTypes2.ts, 160, 54)) + +type UCB = UnionComplement['b']; +>UCB : Symbol(UCB, Decl(conditionalTypes2.ts, 166, 32)) +>UnionComplement : Symbol(UnionComplement, Decl(conditionalTypes2.ts, 160, 54)) + +// {a: "a"; b: "b"} +type UnionComplementComplement = { +>UnionComplementComplement : Symbol(UnionComplementComplement, Decl(conditionalTypes2.ts, 167, 32)) + + [K in Union]: Exclude> +>K : Symbol(K, Decl(conditionalTypes2.ts, 171, 3)) +>Union : Symbol(Union, Decl(conditionalTypes2.ts, 154, 36)) +>Exclude : Symbol(Exclude, Decl(lib.es5.d.ts, --, --)) +>Union : Symbol(Union, Decl(conditionalTypes2.ts, 154, 36)) +>Exclude : Symbol(Exclude, Decl(lib.es5.d.ts, --, --)) +>Union : Symbol(Union, Decl(conditionalTypes2.ts, 154, 36)) +>K : Symbol(K, Decl(conditionalTypes2.ts, 171, 3)) + +}; +type UCCA = UnionComplementComplement['a']; +>UCCA : Symbol(UCCA, Decl(conditionalTypes2.ts, 172, 2)) +>UnionComplementComplement : Symbol(UnionComplementComplement, Decl(conditionalTypes2.ts, 167, 32)) + +type UCCB = UnionComplementComplement['b']; +>UCCB : Symbol(UCCB, Decl(conditionalTypes2.ts, 173, 43)) +>UnionComplementComplement : Symbol(UnionComplementComplement, Decl(conditionalTypes2.ts, 167, 32)) + +// {a: Product<'b', 1>; b: Product<'a', 0>} +type ProductComplement = { +>ProductComplement : Symbol(ProductComplement, Decl(conditionalTypes2.ts, 174, 43)) + + [K in Union]: Exclude +>K : Symbol(K, Decl(conditionalTypes2.ts, 178, 3)) +>Union : Symbol(Union, Decl(conditionalTypes2.ts, 154, 36)) +>Exclude : Symbol(Exclude, Decl(lib.es5.d.ts, --, --)) +>ProductUnion : Symbol(ProductUnion, Decl(conditionalTypes2.ts, 159, 51)) +>f1 : Symbol(f1, Decl(conditionalTypes2.ts, 178, 39)) +>K : Symbol(K, Decl(conditionalTypes2.ts, 178, 3)) + +}; +type PCA = ProductComplement['a']; +>PCA : Symbol(PCA, Decl(conditionalTypes2.ts, 179, 2)) +>ProductComplement : Symbol(ProductComplement, Decl(conditionalTypes2.ts, 174, 43)) + +type PCB = ProductComplement['b']; +>PCB : Symbol(PCB, Decl(conditionalTypes2.ts, 180, 34)) +>ProductComplement : Symbol(ProductComplement, Decl(conditionalTypes2.ts, 174, 43)) + +// {a: Product<'a', 0>; b: Product<'b', 1>} +type ProductComplementComplement = { +>ProductComplementComplement : Symbol(ProductComplementComplement, Decl(conditionalTypes2.ts, 181, 34)) + + [K in Union]: Exclude> +>K : Symbol(K, Decl(conditionalTypes2.ts, 185, 3)) +>Union : Symbol(Union, Decl(conditionalTypes2.ts, 154, 36)) +>Exclude : Symbol(Exclude, Decl(lib.es5.d.ts, --, --)) +>ProductUnion : Symbol(ProductUnion, Decl(conditionalTypes2.ts, 159, 51)) +>Exclude : Symbol(Exclude, Decl(lib.es5.d.ts, --, --)) +>ProductUnion : Symbol(ProductUnion, Decl(conditionalTypes2.ts, 159, 51)) +>f1 : Symbol(f1, Decl(conditionalTypes2.ts, 185, 61)) +>K : Symbol(K, Decl(conditionalTypes2.ts, 185, 3)) + +}; +type PCCA = ProductComplementComplement['a']; +>PCCA : Symbol(PCCA, Decl(conditionalTypes2.ts, 186, 2)) +>ProductComplementComplement : Symbol(ProductComplementComplement, Decl(conditionalTypes2.ts, 181, 34)) + +type PCCB = ProductComplementComplement['b']; +>PCCB : Symbol(PCCB, Decl(conditionalTypes2.ts, 187, 45)) +>ProductComplementComplement : Symbol(ProductComplementComplement, Decl(conditionalTypes2.ts, 181, 34)) + diff --git a/tests/baselines/reference/conditionalTypes2.types b/tests/baselines/reference/conditionalTypes2.types index e500d21d36b..aac6ba47475 100644 --- a/tests/baselines/reference/conditionalTypes2.types +++ b/tests/baselines/reference/conditionalTypes2.types @@ -366,3 +366,68 @@ type T3 = MaybeTrue<{ b: boolean }>; // "yes" >T3 : "yes" >b : boolean +// Repro from #28824 + +type Union = 'a' | 'b'; +>Union : Union + +type Product = { f1: A, f2: B}; +>Product : Product +>f1 : A +>f2 : B + +type ProductUnion = Product<'a', 0> | Product<'b', 1>; +>ProductUnion : ProductUnion + +// {a: "b"; b: "a"} +type UnionComplement = { +>UnionComplement : UnionComplement + + [K in Union]: Exclude +}; +type UCA = UnionComplement['a']; +>UCA : "b" + +type UCB = UnionComplement['b']; +>UCB : "a" + +// {a: "a"; b: "b"} +type UnionComplementComplement = { +>UnionComplementComplement : UnionComplementComplement + + [K in Union]: Exclude> +}; +type UCCA = UnionComplementComplement['a']; +>UCCA : "a" + +type UCCB = UnionComplementComplement['b']; +>UCCB : "b" + +// {a: Product<'b', 1>; b: Product<'a', 0>} +type ProductComplement = { +>ProductComplement : ProductComplement + + [K in Union]: Exclude +>f1 : K + +}; +type PCA = ProductComplement['a']; +>PCA : Product<"b", 1> + +type PCB = ProductComplement['b']; +>PCB : Product<"a", 0> + +// {a: Product<'a', 0>; b: Product<'b', 1>} +type ProductComplementComplement = { +>ProductComplementComplement : ProductComplementComplement + + [K in Union]: Exclude> +>f1 : K + +}; +type PCCA = ProductComplementComplement['a']; +>PCCA : Product<"a", 0> + +type PCCB = ProductComplementComplement['b']; +>PCCB : Product<"b", 1> +