From c78a6a5cad6a5ac160a4debc0908be055e7887ad Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 19 Dec 2017 19:48:30 -0800 Subject: [PATCH 1/3] Fix 'this' parameter handling in getUnionSignatures --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4a600f5a62f..5b6aaa5dabf 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5936,7 +5936,7 @@ namespace ts { if (unionSignatures.length > 1) { let thisParameter = signature.thisParameter; if (forEach(unionSignatures, sig => sig.thisParameter)) { - const thisType = getUnionType(map(unionSignatures, sig => getTypeOfSymbol(sig.thisParameter) || anyType), UnionReduction.Subtype); + const thisType = getUnionType(map(unionSignatures, sig => sig.thisParameter ? getTypeOfSymbol(sig.thisParameter) : anyType), UnionReduction.Subtype); thisParameter = createSymbolWithType(signature.thisParameter, thisType); } s = cloneSignature(signature); From 2f4c8ebf13559bf774326908240cc19d62427af9 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 19 Dec 2017 19:58:28 -0800 Subject: [PATCH 2/3] Add regression test --- .../compiler/unionSignaturesWithThisParameter.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 tests/cases/compiler/unionSignaturesWithThisParameter.ts diff --git a/tests/cases/compiler/unionSignaturesWithThisParameter.ts b/tests/cases/compiler/unionSignaturesWithThisParameter.ts new file mode 100644 index 00000000000..c983ff1a99c --- /dev/null +++ b/tests/cases/compiler/unionSignaturesWithThisParameter.ts @@ -0,0 +1,13 @@ +// @strict: true + +// Repro from #20802 + +function x(ctor: { + (this: {}, v: T): void; + new(v: T): void; +} | { + (v: T): void; + new(v: T): void; +}, t: T) { + new ctor(t); +} From 6f42ecdcd3a9e7388d2e3e87db115fdf4cd1ccb0 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 19 Dec 2017 19:58:36 -0800 Subject: [PATCH 3/3] Accept new baselines --- .../unionSignaturesWithThisParameter.js | 20 +++++++++++ .../unionSignaturesWithThisParameter.symbols | 35 ++++++++++++++++++ .../unionSignaturesWithThisParameter.types | 36 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 tests/baselines/reference/unionSignaturesWithThisParameter.js create mode 100644 tests/baselines/reference/unionSignaturesWithThisParameter.symbols create mode 100644 tests/baselines/reference/unionSignaturesWithThisParameter.types diff --git a/tests/baselines/reference/unionSignaturesWithThisParameter.js b/tests/baselines/reference/unionSignaturesWithThisParameter.js new file mode 100644 index 00000000000..271736bb6e9 --- /dev/null +++ b/tests/baselines/reference/unionSignaturesWithThisParameter.js @@ -0,0 +1,20 @@ +//// [unionSignaturesWithThisParameter.ts] +// Repro from #20802 + +function x(ctor: { + (this: {}, v: T): void; + new(v: T): void; +} | { + (v: T): void; + new(v: T): void; +}, t: T) { + new ctor(t); +} + + +//// [unionSignaturesWithThisParameter.js] +"use strict"; +// Repro from #20802 +function x(ctor, t) { + new ctor(t); +} diff --git a/tests/baselines/reference/unionSignaturesWithThisParameter.symbols b/tests/baselines/reference/unionSignaturesWithThisParameter.symbols new file mode 100644 index 00000000000..5ca1d0e06d5 --- /dev/null +++ b/tests/baselines/reference/unionSignaturesWithThisParameter.symbols @@ -0,0 +1,35 @@ +=== tests/cases/compiler/unionSignaturesWithThisParameter.ts === +// Repro from #20802 + +function x(ctor: { +>x : Symbol(x, Decl(unionSignaturesWithThisParameter.ts, 0, 0)) +>T : Symbol(T, Decl(unionSignaturesWithThisParameter.ts, 2, 11)) +>ctor : Symbol(ctor, Decl(unionSignaturesWithThisParameter.ts, 2, 14)) + + (this: {}, v: T): void; +>this : Symbol(this, Decl(unionSignaturesWithThisParameter.ts, 3, 5)) +>v : Symbol(v, Decl(unionSignaturesWithThisParameter.ts, 3, 14)) +>T : Symbol(T, Decl(unionSignaturesWithThisParameter.ts, 2, 11)) + + new(v: T): void; +>v : Symbol(v, Decl(unionSignaturesWithThisParameter.ts, 4, 8)) +>T : Symbol(T, Decl(unionSignaturesWithThisParameter.ts, 2, 11)) + +} | { + (v: T): void; +>v : Symbol(v, Decl(unionSignaturesWithThisParameter.ts, 6, 5)) +>T : Symbol(T, Decl(unionSignaturesWithThisParameter.ts, 2, 11)) + + new(v: T): void; +>v : Symbol(v, Decl(unionSignaturesWithThisParameter.ts, 7, 8)) +>T : Symbol(T, Decl(unionSignaturesWithThisParameter.ts, 2, 11)) + +}, t: T) { +>t : Symbol(t, Decl(unionSignaturesWithThisParameter.ts, 8, 2)) +>T : Symbol(T, Decl(unionSignaturesWithThisParameter.ts, 2, 11)) + + new ctor(t); +>ctor : Symbol(ctor, Decl(unionSignaturesWithThisParameter.ts, 2, 14)) +>t : Symbol(t, Decl(unionSignaturesWithThisParameter.ts, 8, 2)) +} + diff --git a/tests/baselines/reference/unionSignaturesWithThisParameter.types b/tests/baselines/reference/unionSignaturesWithThisParameter.types new file mode 100644 index 00000000000..9dd7fbb20b0 --- /dev/null +++ b/tests/baselines/reference/unionSignaturesWithThisParameter.types @@ -0,0 +1,36 @@ +=== tests/cases/compiler/unionSignaturesWithThisParameter.ts === +// Repro from #20802 + +function x(ctor: { +>x : (ctor: { (this: {}, v: T): void; new (v: T): void; } | { (v: T): void; new (v: T): void; }, t: T) => void +>T : T +>ctor : { (this: {}, v: T): void; new (v: T): void; } | { (v: T): void; new (v: T): void; } + + (this: {}, v: T): void; +>this : {} +>v : T +>T : T + + new(v: T): void; +>v : T +>T : T + +} | { + (v: T): void; +>v : T +>T : T + + new(v: T): void; +>v : T +>T : T + +}, t: T) { +>t : T +>T : T + + new ctor(t); +>new ctor(t) : void +>ctor : { (this: {}, v: T): void; new (v: T): void; } | { (v: T): void; new (v: T): void; } +>t : T +} +