Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion tsc/internal/checker/relater.go
Original file line number Diff line number Diff line change
Expand Up @@ -3771,7 +3771,7 @@ func (r *Relater) structuredTypeRelatedToWorker(source *Type, target *Type, repo
mapper = ctx.mapper
}
if r.c.isTypeIdenticalTo(sourceExtends, target.AsConditionalType().extendsType) && (r.isRelatedTo(source.AsConditionalType().checkType, target.AsConditionalType().checkType, RecursionFlagsBoth, false) != 0 || r.isRelatedTo(target.AsConditionalType().checkType, source.AsConditionalType().checkType, RecursionFlagsBoth, false) != 0) {
result = r.isRelatedTo(r.c.instantiateType(r.c.getTrueTypeFromConditionalType(source), mapper), r.c.getTrueTypeFromConditionalType(target), RecursionFlagsBoth, reportErrors)
result = r.isRelatedTo(r.c.instantiateType(r.c.getTrueTypeFromConditionalType(source), mapper), r.c.instantiateType(r.c.getTrueTypeFromConditionalType(target), mapper), RecursionFlagsBoth, reportErrors)
if result != TernaryFalse {
result &= r.isRelatedTo(r.c.getFalseTypeFromConditionalType(source), r.c.getFalseTypeFromConditionalType(target), RecursionFlagsBoth, reportErrors)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -542,4 +542,14 @@ conditionalTypes1.ts(288,43): error TS2322: Type 'T95<U>' is not assignable to t

type Weird2 = (<U extends boolean>(a: U) => U) extends
(<U extends true>(a: U) => infer T) ? T : never;

// Identical distributive conditional types with locally inferred type parameters
// should remain mutually assignable.
function conditionalRelations<T>(
x: T extends { value: infer U } ? [T, U] : never,
y: T extends { value: infer U } ? [T, U] : never,
) {
x = y;
y = x;
}

21 changes: 21 additions & 0 deletions tsc/testdata/baselines/reference/conformance/conditionalTypes1.js
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,16 @@ type Weird1 = (<U extends boolean>(a: U) => never) extends

type Weird2 = (<U extends boolean>(a: U) => U) extends
(<U extends true>(a: U) => infer T) ? T : never;

// Identical distributive conditional types with locally inferred type parameters
// should remain mutually assignable.
function conditionalRelations<T>(
x: T extends { value: infer U } ? [T, U] : never,
y: T extends { value: infer U } ? [T, U] : never,
) {
x = y;
y = x;
}


//// [conditionalTypes1.js]
Expand Down Expand Up @@ -459,6 +469,12 @@ function f50() {
}
var a = { o: 1, b: 2, c: [{ a: 1, c: '213' }] };
assign(a, { o: 2, c: { 0: { a: 2, c: '213123' } } });
// Identical distributive conditional types with locally inferred type parameters
// should remain mutually assignable.
function conditionalRelations(x, y) {
x = y;
y = x;
}


//// [conditionalTypes1.d.ts]
Expand Down Expand Up @@ -727,3 +743,8 @@ declare var a: {
};
type Weird1 = (<U extends boolean>(a: U) => never) extends (<U extends true>(a: U) => never) ? never : never;
type Weird2 = (<U extends boolean>(a: U) => U) extends (<U extends true>(a: U) => infer T) ? T : never;
declare function conditionalRelations<T>(x: T extends {
value: infer U;
} ? [T, U] : never, y: T extends {
value: infer U;
} ? [T, U] : never): void;
Original file line number Diff line number Diff line change
Expand Up @@ -1400,3 +1400,35 @@ type Weird2 = (<U extends boolean>(a: U) => U) extends
>T : Symbol(T, Decl(conditionalTypes1.ts, 359, 36))
>T : Symbol(T, Decl(conditionalTypes1.ts, 359, 36))

// Identical distributive conditional types with locally inferred type parameters
// should remain mutually assignable.
function conditionalRelations<T>(
>conditionalRelations : Symbol(conditionalRelations, Decl(conditionalTypes1.ts, 359, 52))
>T : Symbol(T, Decl(conditionalTypes1.ts, 363, 30))

x: T extends { value: infer U } ? [T, U] : never,
>x : Symbol(x, Decl(conditionalTypes1.ts, 363, 33))
>T : Symbol(T, Decl(conditionalTypes1.ts, 363, 30))
>value : Symbol(value, Decl(conditionalTypes1.ts, 364, 18))
>U : Symbol(U, Decl(conditionalTypes1.ts, 364, 31))
>T : Symbol(T, Decl(conditionalTypes1.ts, 363, 30))
>U : Symbol(U, Decl(conditionalTypes1.ts, 364, 31))

y: T extends { value: infer U } ? [T, U] : never,
>y : Symbol(y, Decl(conditionalTypes1.ts, 364, 53))
>T : Symbol(T, Decl(conditionalTypes1.ts, 363, 30))
>value : Symbol(value, Decl(conditionalTypes1.ts, 365, 18))
>U : Symbol(U, Decl(conditionalTypes1.ts, 365, 31))
>T : Symbol(T, Decl(conditionalTypes1.ts, 363, 30))
>U : Symbol(U, Decl(conditionalTypes1.ts, 365, 31))

) {
x = y;
>x : Symbol(x, Decl(conditionalTypes1.ts, 363, 33))
>y : Symbol(y, Decl(conditionalTypes1.ts, 364, 53))

y = x;
>y : Symbol(y, Decl(conditionalTypes1.ts, 364, 53))
>x : Symbol(x, Decl(conditionalTypes1.ts, 363, 33))
}

Original file line number Diff line number Diff line change
Expand Up @@ -1073,3 +1073,28 @@ type Weird2 = (<U extends boolean>(a: U) => U) extends
>true : true
>a : U

// Identical distributive conditional types with locally inferred type parameters
// should remain mutually assignable.
function conditionalRelations<T>(
>conditionalRelations : <T>(x: T extends { value: infer U; } ? [T, U] : never, y: T extends { value: infer U; } ? [T, U] : never) => void

x: T extends { value: infer U } ? [T, U] : never,
>x : T extends { value: infer U; } ? [T, U] : never
>value : U

y: T extends { value: infer U } ? [T, U] : never,
>y : T extends { value: infer U; } ? [T, U] : never
>value : U

) {
x = y;
>x = y : T extends { value: infer U; } ? [T, U] : never
>x : T extends { value: infer U; } ? [T, U] : never
>y : T extends { value: infer U; } ? [T, U] : never

y = x;
>y = x : T extends { value: infer U; } ? [T, U] : never
>y : T extends { value: infer U; } ? [T, U] : never
>x : T extends { value: infer U; } ? [T, U] : never
}

Original file line number Diff line number Diff line change
Expand Up @@ -362,3 +362,13 @@ type Weird1 = (<U extends boolean>(a: U) => never) extends

type Weird2 = (<U extends boolean>(a: U) => U) extends
(<U extends true>(a: U) => infer T) ? T : never;

// Identical distributive conditional types with locally inferred type parameters
// should remain mutually assignable.
function conditionalRelations<T>(
x: T extends { value: infer U } ? [T, U] : never,
y: T extends { value: infer U } ? [T, U] : never,
) {
x = y;
y = x;
}