Merge pull request #20814 from Microsoft/fixUnionSignatures

Fix union signatures
This commit is contained in:
Anders Hejlsberg 2017-12-20 09:38:53 -08:00 committed by GitHub
commit 2143a3f439
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 105 additions and 1 deletions

View File

@ -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);

View File

@ -0,0 +1,20 @@
//// [unionSignaturesWithThisParameter.ts]
// Repro from #20802
function x<T>(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);
}

View File

@ -0,0 +1,35 @@
=== tests/cases/compiler/unionSignaturesWithThisParameter.ts ===
// Repro from #20802
function x<T>(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))
}

View File

@ -0,0 +1,36 @@
=== tests/cases/compiler/unionSignaturesWithThisParameter.ts ===
// Repro from #20802
function x<T>(ctor: {
>x : <T>(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
}

View File

@ -0,0 +1,13 @@
// @strict: true
// Repro from #20802
function x<T>(ctor: {
(this: {}, v: T): void;
new(v: T): void;
} | {
(v: T): void;
new(v: T): void;
}, t: T) {
new ctor(t);
}