diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9ac19fb98d060..732f9ca04e019 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14505,7 +14505,8 @@ namespace ts { inferFromTypes(getFalseTypeFromConditionalType(source), getFalseTypeFromConditionalType(target)); } else if (target.flags & TypeFlags.Conditional) { - inferFromTypes(source, getUnionType([getTrueTypeFromConditionalType(target), getFalseTypeFromConditionalType(target)])); + inferFromTypes(source, getTrueTypeFromConditionalType(target)); + inferFromTypes(source, getFalseTypeFromConditionalType(target)); } else if (target.flags & TypeFlags.UnionOrIntersection) { for (const t of (target).types) { diff --git a/tests/baselines/reference/conditionalTypeRelaxingConstraintAssignability.js b/tests/baselines/reference/conditionalTypeRelaxingConstraintAssignability.js new file mode 100644 index 0000000000000..f066b18d5c64f --- /dev/null +++ b/tests/baselines/reference/conditionalTypeRelaxingConstraintAssignability.js @@ -0,0 +1,39 @@ +//// [conditionalTypeRelaxingConstraintAssignability.ts] +export type ElChildren = + | ElChildren.Void + | ElChildren.Text; +export namespace ElChildren { + export type Void = undefined; + export type Text = string; +} + +type Relax = C extends ElChildren.Text ? ElChildren.Text : C; + +export class Elem< + C extends ElChildren, + > { + constructor( + private children_: Relax, + ) { + } +} + +new Elem(undefined as ElChildren.Void); +new Elem('' as ElChildren.Text); +new Elem('' as ElChildren.Void | ElChildren.Text); // error +new Elem('' as ElChildren); // error + +//// [conditionalTypeRelaxingConstraintAssignability.js] +"use strict"; +exports.__esModule = true; +var Elem = /** @class */ (function () { + function Elem(children_) { + this.children_ = children_; + } + return Elem; +}()); +exports.Elem = Elem; +new Elem(undefined); +new Elem(''); +new Elem(''); // error +new Elem(''); // error diff --git a/tests/baselines/reference/conditionalTypeRelaxingConstraintAssignability.symbols b/tests/baselines/reference/conditionalTypeRelaxingConstraintAssignability.symbols new file mode 100644 index 0000000000000..7ce85b0fbfaf8 --- /dev/null +++ b/tests/baselines/reference/conditionalTypeRelaxingConstraintAssignability.symbols @@ -0,0 +1,73 @@ +=== tests/cases/compiler/conditionalTypeRelaxingConstraintAssignability.ts === +export type ElChildren = +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) + + | ElChildren.Void +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) +>Void : Symbol(ElChildren.Void, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 3, 29)) + + | ElChildren.Text; +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) +>Text : Symbol(ElChildren.Text, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 4, 31)) + +export namespace ElChildren { +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) + + export type Void = undefined; +>Void : Symbol(Void, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 3, 29)) + + export type Text = string; +>Text : Symbol(Text, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 4, 31)) +} + +type Relax = C extends ElChildren.Text ? ElChildren.Text : C; +>Relax : Symbol(Relax, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 6, 1)) +>C : Symbol(C, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 8, 11)) +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) +>C : Symbol(C, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 8, 11)) +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) +>Text : Symbol(ElChildren.Text, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 4, 31)) +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) +>Text : Symbol(ElChildren.Text, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 4, 31)) +>C : Symbol(C, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 8, 11)) + +export class Elem< +>Elem : Symbol(Elem, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 8, 83)) + + C extends ElChildren, +>C : Symbol(C, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 10, 18)) +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) + + > { + constructor( + private children_: Relax, +>children_ : Symbol(Elem.children_, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 13, 14)) +>Relax : Symbol(Relax, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 6, 1)) +>C : Symbol(C, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 10, 18)) + + ) { + } +} + +new Elem(undefined as ElChildren.Void); +>Elem : Symbol(Elem, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 8, 83)) +>undefined : Symbol(undefined) +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) +>Void : Symbol(ElChildren.Void, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 3, 29)) + +new Elem('' as ElChildren.Text); +>Elem : Symbol(Elem, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 8, 83)) +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) +>Text : Symbol(ElChildren.Text, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 4, 31)) + +new Elem('' as ElChildren.Void | ElChildren.Text); // error +>Elem : Symbol(Elem, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 8, 83)) +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) +>Void : Symbol(ElChildren.Void, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 3, 29)) +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) +>Text : Symbol(ElChildren.Text, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 4, 31)) + +new Elem('' as ElChildren); // error +>Elem : Symbol(Elem, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 8, 83)) +>ElChildren : Symbol(ElChildren, Decl(conditionalTypeRelaxingConstraintAssignability.ts, 0, 0), Decl(conditionalTypeRelaxingConstraintAssignability.ts, 2, 20)) + diff --git a/tests/baselines/reference/conditionalTypeRelaxingConstraintAssignability.types b/tests/baselines/reference/conditionalTypeRelaxingConstraintAssignability.types new file mode 100644 index 0000000000000..c827e26bddb99 --- /dev/null +++ b/tests/baselines/reference/conditionalTypeRelaxingConstraintAssignability.types @@ -0,0 +1,64 @@ +=== tests/cases/compiler/conditionalTypeRelaxingConstraintAssignability.ts === +export type ElChildren = +>ElChildren : ElChildren + + | ElChildren.Void +>ElChildren : any + + | ElChildren.Text; +>ElChildren : any + +export namespace ElChildren { + export type Void = undefined; +>Void : undefined + + export type Text = string; +>Text : string +} + +type Relax = C extends ElChildren.Text ? ElChildren.Text : C; +>Relax : Relax +>ElChildren : any +>ElChildren : any + +export class Elem< +>Elem : Elem + + C extends ElChildren, + > { + constructor( + private children_: Relax, +>children_ : Relax + + ) { + } +} + +new Elem(undefined as ElChildren.Void); +>new Elem(undefined as ElChildren.Void) : Elem +>Elem : typeof Elem +>undefined as ElChildren.Void : undefined +>undefined : undefined +>ElChildren : any + +new Elem('' as ElChildren.Text); +>new Elem('' as ElChildren.Text) : Elem +>Elem : typeof Elem +>'' as ElChildren.Text : string +>'' : "" +>ElChildren : any + +new Elem('' as ElChildren.Void | ElChildren.Text); // error +>new Elem('' as ElChildren.Void | ElChildren.Text) : Elem +>Elem : typeof Elem +>'' as ElChildren.Void | ElChildren.Text : ElChildren +>'' : "" +>ElChildren : any +>ElChildren : any + +new Elem('' as ElChildren); // error +>new Elem('' as ElChildren) : Elem +>Elem : typeof Elem +>'' as ElChildren : ElChildren +>'' : "" + diff --git a/tests/cases/compiler/conditionalTypeRelaxingConstraintAssignability.ts b/tests/cases/compiler/conditionalTypeRelaxingConstraintAssignability.ts new file mode 100644 index 0000000000000..2f18e464e3b1d --- /dev/null +++ b/tests/cases/compiler/conditionalTypeRelaxingConstraintAssignability.ts @@ -0,0 +1,24 @@ +// @strict: true +export type ElChildren = + | ElChildren.Void + | ElChildren.Text; +export namespace ElChildren { + export type Void = undefined; + export type Text = string; +} + +type Relax = C extends ElChildren.Text ? ElChildren.Text : C; + +export class Elem< + C extends ElChildren, + > { + constructor( + private children_: Relax, + ) { + } +} + +new Elem(undefined as ElChildren.Void); +new Elem('' as ElChildren.Text); +new Elem('' as ElChildren.Void | ElChildren.Text); // error +new Elem('' as ElChildren); // error \ No newline at end of file