diff --git a/tsc/internal/checker/checker.go b/tsc/internal/checker/checker.go index 415c8ecdf73f2..1508cd7f6a726 100644 --- a/tsc/internal/checker/checker.go +++ b/tsc/internal/checker/checker.go @@ -24268,6 +24268,7 @@ func (c *Checker) getInferTypeParameters(node *ast.Node) []*Type { result = append(result, c.getDeclaredTypeOfSymbol(symbol)) } } + slices.SortFunc(result, CompareTypes) return result } diff --git a/tsc/testdata/baselines/reference/compiler/stableTypeMapperOrdering.js b/tsc/testdata/baselines/reference/compiler/stableTypeMapperOrdering.js new file mode 100644 index 0000000000000..b952fd27365b5 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/stableTypeMapperOrdering.js @@ -0,0 +1,54 @@ +//// [tests/cases/compiler/stableTypeMapperOrdering.ts] //// + +//// [stableTypeMapperOrdering.ts] +// https://github.com/microsoft/TypeScript/issues/64589 + +interface Endpoint { + readonly name: Name; + readonly params: Params; + readonly middleware: Middleware; + readonly services: Services; +} + +type Same = R; + +type AddMiddleware = + E extends Endpoint + ? Endpoint> + : never; + +interface Group { + add( + name: N, + params?: P, + ): Group>; + middleware(id: I): Group>; +} + +declare const group: Group; + +export const result = group.add("a", { id: "" }).add("c").middleware("m" as const); + + +//// [stableTypeMapperOrdering.js] +// https://github.com/microsoft/TypeScript/issues/64589 +export const result = group.add("a", { id: "" }).add("c").middleware("m"); + + +//// [stableTypeMapperOrdering.d.ts] +interface Endpoint { + readonly name: Name; + readonly params: Params; + readonly middleware: Middleware; + readonly services: Services; +} +type Same = R; +type AddMiddleware = E extends Endpoint ? Endpoint> : never; +interface Group { + add(name: N, params?: P): Group>; + middleware(id: I): Group>; +} +export declare const result: Group | Endpoint<"c", never, "m", never>>; +export {}; diff --git a/tsc/testdata/baselines/reference/compiler/stableTypeMapperOrdering.symbols b/tsc/testdata/baselines/reference/compiler/stableTypeMapperOrdering.symbols new file mode 100644 index 0000000000000..3a60fd1d4ce2a --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/stableTypeMapperOrdering.symbols @@ -0,0 +1,111 @@ +//// [tests/cases/compiler/stableTypeMapperOrdering.ts] //// + +=== stableTypeMapperOrdering.ts === +// https://github.com/microsoft/TypeScript/issues/64589 + +interface Endpoint { +>Endpoint : Symbol(Endpoint, Decl(stableTypeMapperOrdering.ts, 0, 0)) +>Name : Symbol(Name, Decl(stableTypeMapperOrdering.ts, 2, 19)) +>Params : Symbol(Params, Decl(stableTypeMapperOrdering.ts, 2, 24)) +>Middleware : Symbol(Middleware, Decl(stableTypeMapperOrdering.ts, 2, 32)) +>Services : Symbol(Services, Decl(stableTypeMapperOrdering.ts, 2, 44)) + + readonly name: Name; +>name : Symbol(Endpoint.name, Decl(stableTypeMapperOrdering.ts, 2, 56)) +>Name : Symbol(Name, Decl(stableTypeMapperOrdering.ts, 2, 19)) + + readonly params: Params; +>params : Symbol(Endpoint.params, Decl(stableTypeMapperOrdering.ts, 3, 22)) +>Params : Symbol(Params, Decl(stableTypeMapperOrdering.ts, 2, 24)) + + readonly middleware: Middleware; +>middleware : Symbol(Endpoint.middleware, Decl(stableTypeMapperOrdering.ts, 4, 26)) +>Middleware : Symbol(Middleware, Decl(stableTypeMapperOrdering.ts, 2, 32)) + + readonly services: Services; +>services : Symbol(Endpoint.services, Decl(stableTypeMapperOrdering.ts, 5, 34)) +>Services : Symbol(Services, Decl(stableTypeMapperOrdering.ts, 2, 44)) +} + +type Same = R; +>Same : Symbol(Same, Decl(stableTypeMapperOrdering.ts, 7, 1)) +>A : Symbol(A, Decl(stableTypeMapperOrdering.ts, 9, 10)) +>R : Symbol(R, Decl(stableTypeMapperOrdering.ts, 9, 12)) +>R : Symbol(R, Decl(stableTypeMapperOrdering.ts, 9, 12)) + +type AddMiddleware = +>AddMiddleware : Symbol(AddMiddleware, Decl(stableTypeMapperOrdering.ts, 9, 20)) +>E : Symbol(E, Decl(stableTypeMapperOrdering.ts, 11, 19)) +>I : Symbol(I, Decl(stableTypeMapperOrdering.ts, 11, 21)) + + E extends Endpoint +>E : Symbol(E, Decl(stableTypeMapperOrdering.ts, 11, 19)) +>Endpoint : Symbol(Endpoint, Decl(stableTypeMapperOrdering.ts, 0, 0)) +>N : Symbol(N, Decl(stableTypeMapperOrdering.ts, 12, 26)) +>P : Symbol(P, Decl(stableTypeMapperOrdering.ts, 12, 35)) +>M : Symbol(M, Decl(stableTypeMapperOrdering.ts, 12, 44)) +>S : Symbol(S, Decl(stableTypeMapperOrdering.ts, 12, 53)) + + ? Endpoint> +>Endpoint : Symbol(Endpoint, Decl(stableTypeMapperOrdering.ts, 0, 0)) +>N : Symbol(N, Decl(stableTypeMapperOrdering.ts, 12, 26)) +>P : Symbol(P, Decl(stableTypeMapperOrdering.ts, 12, 35)) +>M : Symbol(M, Decl(stableTypeMapperOrdering.ts, 12, 44)) +>I : Symbol(I, Decl(stableTypeMapperOrdering.ts, 11, 21)) +>Same : Symbol(Same, Decl(stableTypeMapperOrdering.ts, 7, 1)) +>I : Symbol(I, Decl(stableTypeMapperOrdering.ts, 11, 21)) +>S : Symbol(S, Decl(stableTypeMapperOrdering.ts, 12, 53)) + + : never; + +interface Group { +>Group : Symbol(Group, Decl(stableTypeMapperOrdering.ts, 14, 12)) +>Endpoints : Symbol(Endpoints, Decl(stableTypeMapperOrdering.ts, 16, 16)) + + add( +>add : Symbol(Group.add, Decl(stableTypeMapperOrdering.ts, 16, 28)) +>N : Symbol(N, Decl(stableTypeMapperOrdering.ts, 17, 6)) +>P : Symbol(P, Decl(stableTypeMapperOrdering.ts, 17, 23)) + + name: N, +>name : Symbol(name, Decl(stableTypeMapperOrdering.ts, 17, 35)) +>N : Symbol(N, Decl(stableTypeMapperOrdering.ts, 17, 6)) + + params?: P, +>params : Symbol(params, Decl(stableTypeMapperOrdering.ts, 18, 12)) +>P : Symbol(P, Decl(stableTypeMapperOrdering.ts, 17, 23)) + + ): Group>; +>Group : Symbol(Group, Decl(stableTypeMapperOrdering.ts, 14, 12)) +>Endpoints : Symbol(Endpoints, Decl(stableTypeMapperOrdering.ts, 16, 16)) +>Endpoint : Symbol(Endpoint, Decl(stableTypeMapperOrdering.ts, 0, 0)) +>N : Symbol(N, Decl(stableTypeMapperOrdering.ts, 17, 6)) +>P : Symbol(P, Decl(stableTypeMapperOrdering.ts, 17, 23)) + + middleware(id: I): Group>; +>middleware : Symbol(Group.middleware, Decl(stableTypeMapperOrdering.ts, 20, 53)) +>I : Symbol(I, Decl(stableTypeMapperOrdering.ts, 21, 13)) +>id : Symbol(id, Decl(stableTypeMapperOrdering.ts, 21, 16)) +>I : Symbol(I, Decl(stableTypeMapperOrdering.ts, 21, 13)) +>Group : Symbol(Group, Decl(stableTypeMapperOrdering.ts, 14, 12)) +>AddMiddleware : Symbol(AddMiddleware, Decl(stableTypeMapperOrdering.ts, 9, 20)) +>Endpoints : Symbol(Endpoints, Decl(stableTypeMapperOrdering.ts, 16, 16)) +>I : Symbol(I, Decl(stableTypeMapperOrdering.ts, 21, 13)) +} + +declare const group: Group; +>group : Symbol(group, Decl(stableTypeMapperOrdering.ts, 24, 13)) +>Group : Symbol(Group, Decl(stableTypeMapperOrdering.ts, 14, 12)) + +export const result = group.add("a", { id: "" }).add("c").middleware("m" as const); +>result : Symbol(result, Decl(stableTypeMapperOrdering.ts, 26, 12)) +>group.add("a", { id: "" }).add("c").middleware : Symbol(Group.middleware, Decl(stableTypeMapperOrdering.ts, 20, 53)) +>group.add("a", { id: "" }).add : Symbol(Group.add, Decl(stableTypeMapperOrdering.ts, 16, 28)) +>group.add : Symbol(Group.add, Decl(stableTypeMapperOrdering.ts, 16, 28)) +>group : Symbol(group, Decl(stableTypeMapperOrdering.ts, 24, 13)) +>add : Symbol(Group.add, Decl(stableTypeMapperOrdering.ts, 16, 28)) +>id : Symbol(id, Decl(stableTypeMapperOrdering.ts, 26, 38)) +>add : Symbol(Group.add, Decl(stableTypeMapperOrdering.ts, 16, 28)) +>middleware : Symbol(Group.middleware, Decl(stableTypeMapperOrdering.ts, 20, 53)) +>const : Symbol(const) + diff --git a/tsc/testdata/baselines/reference/compiler/stableTypeMapperOrdering.types b/tsc/testdata/baselines/reference/compiler/stableTypeMapperOrdering.types new file mode 100644 index 0000000000000..1ced1bacefd75 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/stableTypeMapperOrdering.types @@ -0,0 +1,68 @@ +//// [tests/cases/compiler/stableTypeMapperOrdering.ts] //// + +=== stableTypeMapperOrdering.ts === +// https://github.com/microsoft/TypeScript/issues/64589 + +interface Endpoint { + readonly name: Name; +>name : Name + + readonly params: Params; +>params : Params + + readonly middleware: Middleware; +>middleware : Middleware + + readonly services: Services; +>services : Services +} + +type Same = R; +>Same : R + +type AddMiddleware = +>AddMiddleware : AddMiddleware + + E extends Endpoint + ? Endpoint> + : never; + +interface Group { + add( +>add : (name: N, params?: P) => Group> + + name: N, +>name : N + + params?: P, +>params : P | undefined + + ): Group>; + middleware(id: I): Group>; +>middleware : (id: I) => Group> +>id : I +} + +declare const group: Group; +>group : Group + +export const result = group.add("a", { id: "" }).add("c").middleware("m" as const); +>result : Group | Endpoint<"c", never, "m", never>> +>group.add("a", { id: "" }).add("c").middleware("m" as const) : Group | Endpoint<"c", never, "m", never>> +>group.add("a", { id: "" }).add("c").middleware : (id: I) => Group | Endpoint<"c", never, I, never>> +>group.add("a", { id: "" }).add("c") : Group | Endpoint<"c", never, never, never>> +>group.add("a", { id: "" }).add : (name: N, params?: P | undefined) => Group | Endpoint> +>group.add("a", { id: "" }) : Group> +>group.add : (name: N, params?: P | undefined) => Group> +>group : Group +>add : (name: N, params?: P | undefined) => Group> +>"a" : "a" +>{ id: "" } : { id: string; } +>id : string +>"" : "" +>add : (name: N, params?: P | undefined) => Group | Endpoint> +>"c" : "c" +>middleware : (id: I) => Group | Endpoint<"c", never, I, never>> +>"m" as const : "m" +>"m" : "m" + diff --git a/tsc/testdata/tests/cases/compiler/stableTypeMapperOrdering.ts b/tsc/testdata/tests/cases/compiler/stableTypeMapperOrdering.ts new file mode 100644 index 0000000000000..624003b554aa0 --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/stableTypeMapperOrdering.ts @@ -0,0 +1,29 @@ +// @declaration: true + +// https://github.com/microsoft/TypeScript/issues/64589 + +interface Endpoint { + readonly name: Name; + readonly params: Params; + readonly middleware: Middleware; + readonly services: Services; +} + +type Same = R; + +type AddMiddleware = + E extends Endpoint + ? Endpoint> + : never; + +interface Group { + add( + name: N, + params?: P, + ): Group>; + middleware(id: I): Group>; +} + +declare const group: Group; + +export const result = group.add("a", { id: "" }).add("c").middleware("m" as const);