Update tests with improved spread-falsy-union rules

This commit is contained in:
Nathan Shively-Sanders 2017-09-15 10:06:58 -07:00
parent 9c6f65175b
commit f97d5fa11d
28 changed files with 707 additions and 372 deletions

View File

@ -38,12 +38,26 @@ getter.a = 12;
// functions result in { }
let spreadFunc = { ...(function () { }) };
// boolean && T results in Partial<T>
function conditionalSpreadBoolean(b: boolean) : { x?: number | undefined, y?: number | undefined } {
return { ...b && { x: 1, y: 2 } };
type Header = { head: string, body: string, authToken: string }
function from16326(this: { header: Header }, header: Header, authToken: string): Header {
return {
...this.header,
...header,
...authToken && { authToken }
}
}
function conditionalSpreadNumber(nt: number): { x?: number | undefined, y: number } {
// boolean && T results in Partial<T>
function conditionalSpreadBoolean(b: boolean) : { x: number, y: number } {
let o = { x: 12, y: 13 }
o = {
...o,
...b && { x: 14 }
}
let o2 = { ...b && { x: 21 }}
return o;
}
function conditionalSpreadNumber(nt: number): { x: number, y: number } {
let o = { x: 15, y: 16 }
o = {
...o,
...nt && { x: nt }
@ -51,8 +65,8 @@ function conditionalSpreadNumber(nt: number): { x?: number | undefined, y: numbe
let o2 = { ...nt && { x: nt }}
return o;
}
function conditionalSpreadString(st: string): { x?: string | undefined, y: number } {
let o = { x: 'hi', y: 13 }
function conditionalSpreadString(st: string): { x: string, y: number } {
let o = { x: 'hi', y: 17 }
o = {
...o,
...st && { x: st }
@ -60,8 +74,6 @@ function conditionalSpreadString(st: string): { x?: string | undefined, y: numbe
let o2 = { ...st && { x: st }}
return o;
}
// other booleans result in { }
let spreadBool = { ... true }
// any results in any
let anything: any;
@ -141,24 +153,28 @@ var getter = __assign({}, op, { c: 7 });
getter.a = 12;
// functions result in { }
var spreadFunc = __assign({}, (function () { }));
function from16326(header, authToken) {
return __assign({}, this.header, header, authToken && { authToken: authToken });
}
// boolean && T results in Partial<T>
function conditionalSpreadBoolean(b) {
return __assign({}, b && { x: 1, y: 2 });
var o = { x: 12, y: 13 };
o = __assign({}, o, b && { x: 14 });
var o2 = __assign({}, b && { x: 21 });
return o;
}
function conditionalSpreadNumber(nt) {
var o = { x: 12, y: 13 };
var o = { x: 15, y: 16 };
o = __assign({}, o, nt && { x: nt });
var o2 = __assign({}, nt && { x: nt });
return o;
}
function conditionalSpreadString(st) {
var o = { x: 'hi', y: 13 };
var o = { x: 'hi', y: 17 };
o = __assign({}, o, st && { x: st });
var o2 = __assign({}, st && { x: st });
return o;
}
// other booleans result in { }
var spreadBool = __assign({}, true);
// any results in any
var anything;
var spreadAny = __assign({}, anything);

View File

@ -169,144 +169,189 @@ getter.a = 12;
let spreadFunc = { ...(function () { }) };
>spreadFunc : Symbol(spreadFunc, Decl(objectSpread.ts, 37, 3))
// boolean && T results in Partial<T>
function conditionalSpreadBoolean(b: boolean) : { x?: number | undefined, y?: number | undefined } {
>conditionalSpreadBoolean : Symbol(conditionalSpreadBoolean, Decl(objectSpread.ts, 37, 42))
>b : Symbol(b, Decl(objectSpread.ts, 40, 34))
>x : Symbol(x, Decl(objectSpread.ts, 40, 49))
>y : Symbol(y, Decl(objectSpread.ts, 40, 73))
type Header = { head: string, body: string, authToken: string }
>Header : Symbol(Header, Decl(objectSpread.ts, 37, 42))
>head : Symbol(head, Decl(objectSpread.ts, 39, 15))
>body : Symbol(body, Decl(objectSpread.ts, 39, 29))
>authToken : Symbol(authToken, Decl(objectSpread.ts, 39, 43))
return { ...b && { x: 1, y: 2 } };
>b : Symbol(b, Decl(objectSpread.ts, 40, 34))
>x : Symbol(x, Decl(objectSpread.ts, 41, 22))
>y : Symbol(y, Decl(objectSpread.ts, 41, 28))
function from16326(this: { header: Header }, header: Header, authToken: string): Header {
>from16326 : Symbol(from16326, Decl(objectSpread.ts, 39, 63))
>this : Symbol(this, Decl(objectSpread.ts, 40, 19))
>header : Symbol(header, Decl(objectSpread.ts, 40, 26))
>Header : Symbol(Header, Decl(objectSpread.ts, 37, 42))
>header : Symbol(header, Decl(objectSpread.ts, 40, 44))
>Header : Symbol(Header, Decl(objectSpread.ts, 37, 42))
>authToken : Symbol(authToken, Decl(objectSpread.ts, 40, 60))
>Header : Symbol(Header, Decl(objectSpread.ts, 37, 42))
return {
...this.header,
>this.header : Symbol(header, Decl(objectSpread.ts, 40, 26))
>this : Symbol(this, Decl(objectSpread.ts, 40, 19))
>header : Symbol(header, Decl(objectSpread.ts, 40, 26))
...header,
>header : Symbol(header, Decl(objectSpread.ts, 40, 44))
...authToken && { authToken }
>authToken : Symbol(authToken, Decl(objectSpread.ts, 40, 60))
>authToken : Symbol(authToken, Decl(objectSpread.ts, 44, 25))
}
}
function conditionalSpreadNumber(nt: number): { x?: number | undefined, y: number } {
>conditionalSpreadNumber : Symbol(conditionalSpreadNumber, Decl(objectSpread.ts, 42, 1))
>nt : Symbol(nt, Decl(objectSpread.ts, 43, 33))
>x : Symbol(x, Decl(objectSpread.ts, 43, 47))
>y : Symbol(y, Decl(objectSpread.ts, 43, 71))
// boolean && T results in Partial<T>
function conditionalSpreadBoolean(b: boolean) : { x: number, y: number } {
>conditionalSpreadBoolean : Symbol(conditionalSpreadBoolean, Decl(objectSpread.ts, 46, 1))
>b : Symbol(b, Decl(objectSpread.ts, 48, 34))
>x : Symbol(x, Decl(objectSpread.ts, 48, 49))
>y : Symbol(y, Decl(objectSpread.ts, 48, 60))
let o = { x: 12, y: 13 }
>o : Symbol(o, Decl(objectSpread.ts, 44, 7))
>x : Symbol(x, Decl(objectSpread.ts, 44, 13))
>y : Symbol(y, Decl(objectSpread.ts, 44, 20))
>o : Symbol(o, Decl(objectSpread.ts, 49, 7))
>x : Symbol(x, Decl(objectSpread.ts, 49, 13))
>y : Symbol(y, Decl(objectSpread.ts, 49, 20))
o = {
>o : Symbol(o, Decl(objectSpread.ts, 44, 7))
>o : Symbol(o, Decl(objectSpread.ts, 49, 7))
...o,
>o : Symbol(o, Decl(objectSpread.ts, 44, 7))
>o : Symbol(o, Decl(objectSpread.ts, 49, 7))
...b && { x: 14 }
>b : Symbol(b, Decl(objectSpread.ts, 48, 34))
>x : Symbol(x, Decl(objectSpread.ts, 52, 17))
}
let o2 = { ...b && { x: 21 }}
>o2 : Symbol(o2, Decl(objectSpread.ts, 54, 7))
>b : Symbol(b, Decl(objectSpread.ts, 48, 34))
>x : Symbol(x, Decl(objectSpread.ts, 54, 24))
return o;
>o : Symbol(o, Decl(objectSpread.ts, 49, 7))
}
function conditionalSpreadNumber(nt: number): { x: number, y: number } {
>conditionalSpreadNumber : Symbol(conditionalSpreadNumber, Decl(objectSpread.ts, 56, 1))
>nt : Symbol(nt, Decl(objectSpread.ts, 57, 33))
>x : Symbol(x, Decl(objectSpread.ts, 57, 47))
>y : Symbol(y, Decl(objectSpread.ts, 57, 58))
let o = { x: 15, y: 16 }
>o : Symbol(o, Decl(objectSpread.ts, 58, 7))
>x : Symbol(x, Decl(objectSpread.ts, 58, 13))
>y : Symbol(y, Decl(objectSpread.ts, 58, 20))
o = {
>o : Symbol(o, Decl(objectSpread.ts, 58, 7))
...o,
>o : Symbol(o, Decl(objectSpread.ts, 58, 7))
...nt && { x: nt }
>nt : Symbol(nt, Decl(objectSpread.ts, 43, 33))
>x : Symbol(x, Decl(objectSpread.ts, 47, 18))
>nt : Symbol(nt, Decl(objectSpread.ts, 43, 33))
>nt : Symbol(nt, Decl(objectSpread.ts, 57, 33))
>x : Symbol(x, Decl(objectSpread.ts, 61, 18))
>nt : Symbol(nt, Decl(objectSpread.ts, 57, 33))
}
let o2 = { ...nt && { x: nt }}
>o2 : Symbol(o2, Decl(objectSpread.ts, 49, 7))
>nt : Symbol(nt, Decl(objectSpread.ts, 43, 33))
>x : Symbol(x, Decl(objectSpread.ts, 49, 25))
>nt : Symbol(nt, Decl(objectSpread.ts, 43, 33))
>o2 : Symbol(o2, Decl(objectSpread.ts, 63, 7))
>nt : Symbol(nt, Decl(objectSpread.ts, 57, 33))
>x : Symbol(x, Decl(objectSpread.ts, 63, 25))
>nt : Symbol(nt, Decl(objectSpread.ts, 57, 33))
return o;
>o : Symbol(o, Decl(objectSpread.ts, 44, 7))
>o : Symbol(o, Decl(objectSpread.ts, 58, 7))
}
function conditionalSpreadString(st: string): { x?: string | undefined, y: number } {
>conditionalSpreadString : Symbol(conditionalSpreadString, Decl(objectSpread.ts, 51, 1))
>st : Symbol(st, Decl(objectSpread.ts, 52, 33))
>x : Symbol(x, Decl(objectSpread.ts, 52, 47))
>y : Symbol(y, Decl(objectSpread.ts, 52, 71))
function conditionalSpreadString(st: string): { x: string, y: number } {
>conditionalSpreadString : Symbol(conditionalSpreadString, Decl(objectSpread.ts, 65, 1))
>st : Symbol(st, Decl(objectSpread.ts, 66, 33))
>x : Symbol(x, Decl(objectSpread.ts, 66, 47))
>y : Symbol(y, Decl(objectSpread.ts, 66, 58))
let o = { x: 'hi', y: 13 }
>o : Symbol(o, Decl(objectSpread.ts, 53, 7))
>x : Symbol(x, Decl(objectSpread.ts, 53, 13))
>y : Symbol(y, Decl(objectSpread.ts, 53, 22))
let o = { x: 'hi', y: 17 }
>o : Symbol(o, Decl(objectSpread.ts, 67, 7))
>x : Symbol(x, Decl(objectSpread.ts, 67, 13))
>y : Symbol(y, Decl(objectSpread.ts, 67, 22))
o = {
>o : Symbol(o, Decl(objectSpread.ts, 53, 7))
>o : Symbol(o, Decl(objectSpread.ts, 67, 7))
...o,
>o : Symbol(o, Decl(objectSpread.ts, 53, 7))
>o : Symbol(o, Decl(objectSpread.ts, 67, 7))
...st && { x: st }
>st : Symbol(st, Decl(objectSpread.ts, 52, 33))
>x : Symbol(x, Decl(objectSpread.ts, 56, 18))
>st : Symbol(st, Decl(objectSpread.ts, 52, 33))
>st : Symbol(st, Decl(objectSpread.ts, 66, 33))
>x : Symbol(x, Decl(objectSpread.ts, 70, 18))
>st : Symbol(st, Decl(objectSpread.ts, 66, 33))
}
let o2 = { ...st && { x: st }}
>o2 : Symbol(o2, Decl(objectSpread.ts, 58, 7))
>st : Symbol(st, Decl(objectSpread.ts, 52, 33))
>x : Symbol(x, Decl(objectSpread.ts, 58, 25))
>st : Symbol(st, Decl(objectSpread.ts, 52, 33))
>o2 : Symbol(o2, Decl(objectSpread.ts, 72, 7))
>st : Symbol(st, Decl(objectSpread.ts, 66, 33))
>x : Symbol(x, Decl(objectSpread.ts, 72, 25))
>st : Symbol(st, Decl(objectSpread.ts, 66, 33))
return o;
>o : Symbol(o, Decl(objectSpread.ts, 53, 7))
>o : Symbol(o, Decl(objectSpread.ts, 67, 7))
}
// other booleans result in { }
let spreadBool = { ... true }
>spreadBool : Symbol(spreadBool, Decl(objectSpread.ts, 62, 3))
// any results in any
let anything: any;
>anything : Symbol(anything, Decl(objectSpread.ts, 65, 3))
>anything : Symbol(anything, Decl(objectSpread.ts, 77, 3))
let spreadAny = { ...anything };
>spreadAny : Symbol(spreadAny, Decl(objectSpread.ts, 66, 3))
>anything : Symbol(anything, Decl(objectSpread.ts, 65, 3))
>spreadAny : Symbol(spreadAny, Decl(objectSpread.ts, 78, 3))
>anything : Symbol(anything, Decl(objectSpread.ts, 77, 3))
// methods are not enumerable
class C { p = 1; m() { } }
>C : Symbol(C, Decl(objectSpread.ts, 66, 32))
>p : Symbol(C.p, Decl(objectSpread.ts, 69, 9))
>m : Symbol(C.m, Decl(objectSpread.ts, 69, 16))
>C : Symbol(C, Decl(objectSpread.ts, 78, 32))
>p : Symbol(C.p, Decl(objectSpread.ts, 81, 9))
>m : Symbol(C.m, Decl(objectSpread.ts, 81, 16))
let c: C = new C()
>c : Symbol(c, Decl(objectSpread.ts, 70, 3))
>C : Symbol(C, Decl(objectSpread.ts, 66, 32))
>C : Symbol(C, Decl(objectSpread.ts, 66, 32))
>c : Symbol(c, Decl(objectSpread.ts, 82, 3))
>C : Symbol(C, Decl(objectSpread.ts, 78, 32))
>C : Symbol(C, Decl(objectSpread.ts, 78, 32))
let spreadC: { p: number } = { ...c }
>spreadC : Symbol(spreadC, Decl(objectSpread.ts, 71, 3))
>p : Symbol(p, Decl(objectSpread.ts, 71, 14))
>c : Symbol(c, Decl(objectSpread.ts, 70, 3))
>spreadC : Symbol(spreadC, Decl(objectSpread.ts, 83, 3))
>p : Symbol(p, Decl(objectSpread.ts, 83, 14))
>c : Symbol(c, Decl(objectSpread.ts, 82, 3))
// own methods are enumerable
let cplus: { p: number, plus(): void } = { ...c, plus() { return this.p + 1; } };
>cplus : Symbol(cplus, Decl(objectSpread.ts, 74, 3))
>p : Symbol(p, Decl(objectSpread.ts, 74, 12))
>plus : Symbol(plus, Decl(objectSpread.ts, 74, 23))
>c : Symbol(c, Decl(objectSpread.ts, 70, 3))
>plus : Symbol(plus, Decl(objectSpread.ts, 74, 48))
>cplus : Symbol(cplus, Decl(objectSpread.ts, 86, 3))
>p : Symbol(p, Decl(objectSpread.ts, 86, 12))
>plus : Symbol(plus, Decl(objectSpread.ts, 86, 23))
>c : Symbol(c, Decl(objectSpread.ts, 82, 3))
>plus : Symbol(plus, Decl(objectSpread.ts, 86, 48))
cplus.plus();
>cplus.plus : Symbol(plus, Decl(objectSpread.ts, 74, 23))
>cplus : Symbol(cplus, Decl(objectSpread.ts, 74, 3))
>plus : Symbol(plus, Decl(objectSpread.ts, 74, 23))
>cplus.plus : Symbol(plus, Decl(objectSpread.ts, 86, 23))
>cplus : Symbol(cplus, Decl(objectSpread.ts, 86, 3))
>plus : Symbol(plus, Decl(objectSpread.ts, 86, 23))
// new field's type conflicting with existing field is OK
let changeTypeAfter: { a: string, b: string } =
>changeTypeAfter : Symbol(changeTypeAfter, Decl(objectSpread.ts, 78, 3))
>a : Symbol(a, Decl(objectSpread.ts, 78, 22))
>b : Symbol(b, Decl(objectSpread.ts, 78, 33))
>changeTypeAfter : Symbol(changeTypeAfter, Decl(objectSpread.ts, 90, 3))
>a : Symbol(a, Decl(objectSpread.ts, 90, 22))
>b : Symbol(b, Decl(objectSpread.ts, 90, 33))
{ ...o, a: 'wrong type?' }
>o : Symbol(o, Decl(objectSpread.ts, 0, 3))
>a : Symbol(a, Decl(objectSpread.ts, 79, 11))
>a : Symbol(a, Decl(objectSpread.ts, 91, 11))
let changeTypeBefore: { a: number, b: string } =
>changeTypeBefore : Symbol(changeTypeBefore, Decl(objectSpread.ts, 80, 3))
>a : Symbol(a, Decl(objectSpread.ts, 80, 23))
>b : Symbol(b, Decl(objectSpread.ts, 80, 34))
>changeTypeBefore : Symbol(changeTypeBefore, Decl(objectSpread.ts, 92, 3))
>a : Symbol(a, Decl(objectSpread.ts, 92, 23))
>b : Symbol(b, Decl(objectSpread.ts, 92, 34))
{ a: 'wrong type?', ...o };
>a : Symbol(a, Decl(objectSpread.ts, 81, 5))
>a : Symbol(a, Decl(objectSpread.ts, 93, 5))
>o : Symbol(o, Decl(objectSpread.ts, 0, 3))
let changeTypeBoth: { a: string, b: number } =
>changeTypeBoth : Symbol(changeTypeBoth, Decl(objectSpread.ts, 82, 3))
>a : Symbol(a, Decl(objectSpread.ts, 82, 21))
>b : Symbol(b, Decl(objectSpread.ts, 82, 32))
>changeTypeBoth : Symbol(changeTypeBoth, Decl(objectSpread.ts, 94, 3))
>a : Symbol(a, Decl(objectSpread.ts, 94, 21))
>b : Symbol(b, Decl(objectSpread.ts, 94, 32))
{ ...o, ...swap };
>o : Symbol(o, Decl(objectSpread.ts, 0, 3))
@ -314,90 +359,90 @@ let changeTypeBoth: { a: string, b: number } =
// optional
function container(
>container : Symbol(container, Decl(objectSpread.ts, 83, 22))
>container : Symbol(container, Decl(objectSpread.ts, 95, 22))
definiteBoolean: { sn: boolean },
>definiteBoolean : Symbol(definiteBoolean, Decl(objectSpread.ts, 86, 19))
>sn : Symbol(sn, Decl(objectSpread.ts, 87, 22))
>definiteBoolean : Symbol(definiteBoolean, Decl(objectSpread.ts, 98, 19))
>sn : Symbol(sn, Decl(objectSpread.ts, 99, 22))
definiteString: { sn: string },
>definiteString : Symbol(definiteString, Decl(objectSpread.ts, 87, 37))
>sn : Symbol(sn, Decl(objectSpread.ts, 88, 21))
>definiteString : Symbol(definiteString, Decl(objectSpread.ts, 99, 37))
>sn : Symbol(sn, Decl(objectSpread.ts, 100, 21))
optionalString: { sn?: string },
>optionalString : Symbol(optionalString, Decl(objectSpread.ts, 88, 35))
>sn : Symbol(sn, Decl(objectSpread.ts, 89, 21))
>optionalString : Symbol(optionalString, Decl(objectSpread.ts, 100, 35))
>sn : Symbol(sn, Decl(objectSpread.ts, 101, 21))
optionalNumber: { sn?: number }) {
>optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 89, 36))
>sn : Symbol(sn, Decl(objectSpread.ts, 90, 21))
>optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 101, 36))
>sn : Symbol(sn, Decl(objectSpread.ts, 102, 21))
let optionalUnionStops: { sn: string | number | boolean } = { ...definiteBoolean, ...definiteString, ...optionalNumber };
>optionalUnionStops : Symbol(optionalUnionStops, Decl(objectSpread.ts, 91, 7))
>sn : Symbol(sn, Decl(objectSpread.ts, 91, 29))
>definiteBoolean : Symbol(definiteBoolean, Decl(objectSpread.ts, 86, 19))
>definiteString : Symbol(definiteString, Decl(objectSpread.ts, 87, 37))
>optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 89, 36))
>optionalUnionStops : Symbol(optionalUnionStops, Decl(objectSpread.ts, 103, 7))
>sn : Symbol(sn, Decl(objectSpread.ts, 103, 29))
>definiteBoolean : Symbol(definiteBoolean, Decl(objectSpread.ts, 98, 19))
>definiteString : Symbol(definiteString, Decl(objectSpread.ts, 99, 37))
>optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 101, 36))
let optionalUnionDuplicates: { sn: string | number } = { ...definiteBoolean, ...definiteString, ...optionalString, ...optionalNumber };
>optionalUnionDuplicates : Symbol(optionalUnionDuplicates, Decl(objectSpread.ts, 92, 7))
>sn : Symbol(sn, Decl(objectSpread.ts, 92, 34))
>definiteBoolean : Symbol(definiteBoolean, Decl(objectSpread.ts, 86, 19))
>definiteString : Symbol(definiteString, Decl(objectSpread.ts, 87, 37))
>optionalString : Symbol(optionalString, Decl(objectSpread.ts, 88, 35))
>optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 89, 36))
>optionalUnionDuplicates : Symbol(optionalUnionDuplicates, Decl(objectSpread.ts, 104, 7))
>sn : Symbol(sn, Decl(objectSpread.ts, 104, 34))
>definiteBoolean : Symbol(definiteBoolean, Decl(objectSpread.ts, 98, 19))
>definiteString : Symbol(definiteString, Decl(objectSpread.ts, 99, 37))
>optionalString : Symbol(optionalString, Decl(objectSpread.ts, 100, 35))
>optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 101, 36))
let allOptional: { sn?: string | number } = { ...optionalString, ...optionalNumber };
>allOptional : Symbol(allOptional, Decl(objectSpread.ts, 93, 7))
>sn : Symbol(sn, Decl(objectSpread.ts, 93, 22))
>optionalString : Symbol(optionalString, Decl(objectSpread.ts, 88, 35))
>optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 89, 36))
>allOptional : Symbol(allOptional, Decl(objectSpread.ts, 105, 7))
>sn : Symbol(sn, Decl(objectSpread.ts, 105, 22))
>optionalString : Symbol(optionalString, Decl(objectSpread.ts, 100, 35))
>optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 101, 36))
// computed property
let computedFirst: { a: number, b: string, "before everything": number } =
>computedFirst : Symbol(computedFirst, Decl(objectSpread.ts, 96, 7))
>a : Symbol(a, Decl(objectSpread.ts, 96, 24))
>b : Symbol(b, Decl(objectSpread.ts, 96, 35))
>computedFirst : Symbol(computedFirst, Decl(objectSpread.ts, 108, 7))
>a : Symbol(a, Decl(objectSpread.ts, 108, 24))
>b : Symbol(b, Decl(objectSpread.ts, 108, 35))
{ ['before everything']: 12, ...o, b: 'yes' }
>'before everything' : Symbol(['before everything'], Decl(objectSpread.ts, 97, 9))
>'before everything' : Symbol(['before everything'], Decl(objectSpread.ts, 109, 9))
>o : Symbol(o, Decl(objectSpread.ts, 0, 3))
>b : Symbol(b, Decl(objectSpread.ts, 97, 42))
>b : Symbol(b, Decl(objectSpread.ts, 109, 42))
let computedMiddle: { a: number, b: string, c: boolean, "in the middle": number } =
>computedMiddle : Symbol(computedMiddle, Decl(objectSpread.ts, 98, 7))
>a : Symbol(a, Decl(objectSpread.ts, 98, 25))
>b : Symbol(b, Decl(objectSpread.ts, 98, 36))
>c : Symbol(c, Decl(objectSpread.ts, 98, 47))
>computedMiddle : Symbol(computedMiddle, Decl(objectSpread.ts, 110, 7))
>a : Symbol(a, Decl(objectSpread.ts, 110, 25))
>b : Symbol(b, Decl(objectSpread.ts, 110, 36))
>c : Symbol(c, Decl(objectSpread.ts, 110, 47))
{ ...o, ['in the middle']: 13, b: 'maybe?', ...o2 }
>o : Symbol(o, Decl(objectSpread.ts, 0, 3))
>'in the middle' : Symbol(['in the middle'], Decl(objectSpread.ts, 99, 15))
>b : Symbol(b, Decl(objectSpread.ts, 99, 38))
>'in the middle' : Symbol(['in the middle'], Decl(objectSpread.ts, 111, 15))
>b : Symbol(b, Decl(objectSpread.ts, 111, 38))
>o2 : Symbol(o2, Decl(objectSpread.ts, 1, 3))
let computedAfter: { a: number, b: string, "at the end": number } =
>computedAfter : Symbol(computedAfter, Decl(objectSpread.ts, 100, 7))
>a : Symbol(a, Decl(objectSpread.ts, 100, 24))
>b : Symbol(b, Decl(objectSpread.ts, 100, 35))
>computedAfter : Symbol(computedAfter, Decl(objectSpread.ts, 112, 7))
>a : Symbol(a, Decl(objectSpread.ts, 112, 24))
>b : Symbol(b, Decl(objectSpread.ts, 112, 35))
{ ...o, b: 'yeah', ['at the end']: 14 }
>o : Symbol(o, Decl(objectSpread.ts, 0, 3))
>b : Symbol(b, Decl(objectSpread.ts, 101, 15))
>'at the end' : Symbol(['at the end'], Decl(objectSpread.ts, 101, 26))
>b : Symbol(b, Decl(objectSpread.ts, 113, 15))
>'at the end' : Symbol(['at the end'], Decl(objectSpread.ts, 113, 26))
}
// shortcut syntax
let a = 12;
>a : Symbol(a, Decl(objectSpread.ts, 104, 3))
>a : Symbol(a, Decl(objectSpread.ts, 116, 3))
let shortCutted: { a: number, b: string } = { ...o, a }
>shortCutted : Symbol(shortCutted, Decl(objectSpread.ts, 105, 3))
>a : Symbol(a, Decl(objectSpread.ts, 105, 18))
>b : Symbol(b, Decl(objectSpread.ts, 105, 29))
>shortCutted : Symbol(shortCutted, Decl(objectSpread.ts, 117, 3))
>a : Symbol(a, Decl(objectSpread.ts, 117, 18))
>b : Symbol(b, Decl(objectSpread.ts, 117, 29))
>o : Symbol(o, Decl(objectSpread.ts, 0, 3))
>a : Symbol(a, Decl(objectSpread.ts, 105, 51))
>a : Symbol(a, Decl(objectSpread.ts, 117, 51))
// non primitive
let spreadNonPrimitive = { ...<object>{}};
>spreadNonPrimitive : Symbol(spreadNonPrimitive, Decl(objectSpread.ts, 107, 3))
>spreadNonPrimitive : Symbol(spreadNonPrimitive, Decl(objectSpread.ts, 119, 3))

View File

@ -230,27 +230,45 @@ let spreadFunc = { ...(function () { }) };
>(function () { }) : () => void
>function () { } : () => void
// boolean && T results in Partial<T>
function conditionalSpreadBoolean(b: boolean) : { x?: number | undefined, y?: number | undefined } {
>conditionalSpreadBoolean : (b: boolean) => { x?: number | undefined; y?: number | undefined; }
>b : boolean
>x : number | undefined
>y : number | undefined
type Header = { head: string, body: string, authToken: string }
>Header : Header
>head : string
>body : string
>authToken : string
return { ...b && { x: 1, y: 2 } };
>{ ...b && { x: 1, y: 2 } } : { x?: number | undefined; y?: number | undefined; }
>b && { x: 1, y: 2 } : false | { x: number; y: number; }
>b : boolean
>{ x: 1, y: 2 } : { x: number; y: number; }
>x : number
>1 : 1
>y : number
>2 : 2
function from16326(this: { header: Header }, header: Header, authToken: string): Header {
>from16326 : (this: { header: Header; }, header: Header, authToken: string) => Header
>this : { header: Header; }
>header : Header
>Header : Header
>header : Header
>Header : Header
>authToken : string
>Header : Header
return {
>{ ...this.header, ...header, ...authToken && { authToken } } : { authToken: string; head: string; body: string; }
...this.header,
>this.header : Header
>this : { header: Header; }
>header : Header
...header,
>header : Header
...authToken && { authToken }
>authToken && { authToken } : "" | { authToken: string; }
>authToken : string
>{ authToken } : { authToken: string; }
>authToken : string
}
}
function conditionalSpreadNumber(nt: number): { x?: number | undefined, y: number } {
>conditionalSpreadNumber : (nt: number) => { x?: number | undefined; y: number; }
>nt : number
>x : number | undefined
// boolean && T results in Partial<T>
function conditionalSpreadBoolean(b: boolean) : { x: number, y: number } {
>conditionalSpreadBoolean : (b: boolean) => { x: number; y: number; }
>b : boolean
>x : number
>y : number
let o = { x: 12, y: 13 }
@ -261,6 +279,47 @@ function conditionalSpreadNumber(nt: number): { x?: number | undefined, y: numbe
>y : number
>13 : 13
o = {
>o = { ...o, ...b && { x: 14 } } : { x: number; y: number; }
>o : { x: number; y: number; }
>{ ...o, ...b && { x: 14 } } : { x: number; y: number; }
...o,
>o : { x: number; y: number; }
...b && { x: 14 }
>b && { x: 14 } : false | { x: number; }
>b : boolean
>{ x: 14 } : { x: number; }
>x : number
>14 : 14
}
let o2 = { ...b && { x: 21 }}
>o2 : { x?: number | undefined; }
>{ ...b && { x: 21 }} : { x?: number | undefined; }
>b && { x: 21 } : false | { x: number; }
>b : boolean
>{ x: 21 } : { x: number; }
>x : number
>21 : 21
return o;
>o : { x: number; y: number; }
}
function conditionalSpreadNumber(nt: number): { x: number, y: number } {
>conditionalSpreadNumber : (nt: number) => { x: number; y: number; }
>nt : number
>x : number
>y : number
let o = { x: 15, y: 16 }
>o : { x: number; y: number; }
>{ x: 15, y: 16 } : { x: number; y: number; }
>x : number
>15 : 15
>y : number
>16 : 16
o = {
>o = { ...o, ...nt && { x: nt } } : { x: number; y: number; }
>o : { x: number; y: number; }
@ -288,19 +347,19 @@ function conditionalSpreadNumber(nt: number): { x?: number | undefined, y: numbe
return o;
>o : { x: number; y: number; }
}
function conditionalSpreadString(st: string): { x?: string | undefined, y: number } {
>conditionalSpreadString : (st: string) => { x?: string | undefined; y: number; }
function conditionalSpreadString(st: string): { x: string, y: number } {
>conditionalSpreadString : (st: string) => { x: string; y: number; }
>st : string
>x : string | undefined
>x : string
>y : number
let o = { x: 'hi', y: 13 }
let o = { x: 'hi', y: 17 }
>o : { x: string; y: number; }
>{ x: 'hi', y: 13 } : { x: string; y: number; }
>{ x: 'hi', y: 17 } : { x: string; y: number; }
>x : string
>'hi' : "hi"
>y : number
>13 : 13
>17 : 17
o = {
>o = { ...o, ...st && { x: st } } : { x: string; y: number; }
@ -329,11 +388,6 @@ function conditionalSpreadString(st: string): { x?: string | undefined, y: numbe
return o;
>o : { x: string; y: number; }
}
// other booleans result in { }
let spreadBool = { ... true }
>spreadBool : {}
>{ ... true } : {}
>true : true
// any results in any
let anything: any;

View File

@ -7,23 +7,26 @@ tests/cases/conformance/types/spread/objectSpreadNegative.ts(25,1): error TS2322
Property 's' is missing in type '{ b: boolean; }'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(28,36): error TS2300: Duplicate identifier 'b'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(28,53): error TS2300: Duplicate identifier 'b'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(33,11): error TS2339: Property 'length' does not exist on type '{}'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(34,11): error TS2339: Property 'charAt' does not exist on type '{}'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(37,1): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type '{}' has no compatible call signatures.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(41,12): error TS2339: Property 'b' does not exist on type '{}'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(47,9): error TS2339: Property 'm' does not exist on type '{ p: number; }'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(52,11): error TS2339: Property 'a' does not exist on type '{}'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(56,14): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(59,14): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(73,37): error TS2322: Type '{ a: string; b: string; extra: string; }' is not assignable to type 'A'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(32,19): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(33,19): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(34,20): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(36,20): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(38,19): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(43,1): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type '{}' has no compatible call signatures.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(47,12): error TS2339: Property 'b' does not exist on type '{}'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(53,9): error TS2339: Property 'm' does not exist on type '{ p: number; }'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(58,11): error TS2339: Property 'a' does not exist on type '{}'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(62,14): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(65,14): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(79,37): error TS2322: Type '{ a: string; b: string; extra: string; }' is not assignable to type 'A'.
Object literal may only specify known properties, and 'extra' does not exist in type 'A'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(76,7): error TS2322: Type '{ a: string; b: string; extra: string; }' is not assignable to type 'A'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(82,7): error TS2322: Type '{ a: string; b: string; extra: string; }' is not assignable to type 'A'.
Object literal may only specify known properties, and 'extra' does not exist in type 'A'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(78,7): error TS2322: Type '{ a: string; b: string; extra: string; }' is not assignable to type 'A'.
tests/cases/conformance/types/spread/objectSpreadNegative.ts(84,7): error TS2322: Type '{ a: string; b: string; extra: string; }' is not assignable to type 'A'.
Object literal may only specify known properties, and 'extra' does not exist in type 'A'.
==== tests/cases/conformance/types/spread/objectSpreadNegative.ts (17 errors) ====
==== tests/cases/conformance/types/spread/objectSpreadNegative.ts (20 errors) ====
let o = { a: 1, b: 'no' }
/// private propagates
@ -69,14 +72,26 @@ tests/cases/conformance/types/spread/objectSpreadNegative.ts(78,7): error TS2322
!!! error TS2300: Duplicate identifier 'b'.
let duplicatedSpread = { ...o, ...o }
// primitives are skipped
// primitives are not allowed, except for falsy ones
let spreadNum = { ...12 };
~~~~~
!!! error TS2698: Spread types may only be created from object types.
let spreadSum = { ...1 + 1 };
~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
let spreadZero = { ...0 };
~~~~
!!! error TS2698: Spread types may only be created from object types.
spreadZero.toFixed(); // error, no methods even from a falsy number
let spreadBool = { ...true };
~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
spreadBool.valueOf();
let spreadStr = { ...'foo' };
~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
spreadStr.length; // error, no 'length'
~~~~~~
!!! error TS2339: Property 'length' does not exist on type '{}'.
spreadStr.charAt(1); // error, no methods either
~~~~~~
!!! error TS2339: Property 'charAt' does not exist on type '{}'.
// functions are skipped
let spreadFunc = { ...function () { } }
spreadFunc(); // error, no call signature

View File

@ -29,7 +29,13 @@ spread = b; // error, missing 's'
let duplicated = { b: 'bad', ...o, b: 'bad', ...o2, b: 'bad' }
let duplicatedSpread = { ...o, ...o }
// primitives are skipped
// primitives are not allowed, except for falsy ones
let spreadNum = { ...12 };
let spreadSum = { ...1 + 1 };
let spreadZero = { ...0 };
spreadZero.toFixed(); // error, no methods even from a falsy number
let spreadBool = { ...true };
spreadBool.valueOf();
let spreadStr = { ...'foo' };
spreadStr.length; // error, no 'length'
spreadStr.charAt(1); // error, no methods either
@ -116,7 +122,13 @@ spread = b; // error, missing 's'
// literal repeats are not allowed, but spread repeats are fine
var duplicated = __assign({ b: 'bad' }, o, { b: 'bad' }, o2, { b: 'bad' });
var duplicatedSpread = __assign({}, o, o);
// primitives are skipped
// primitives are not allowed, except for falsy ones
var spreadNum = __assign({}, 12);
var spreadSum = __assign({}, 1 + 1);
var spreadZero = __assign({}, 0);
spreadZero.toFixed(); // error, no methods even from a falsy number
var spreadBool = __assign({}, true);
spreadBool.valueOf();
var spreadStr = __assign({}, 'foo');
spreadStr.length; // error, no 'length'
spreadStr.charAt(1); // error, no methods either

View File

@ -1,5 +1,6 @@
tests/cases/conformance/types/spread/objectSpreadNegativeParse.ts(1,15): error TS2304: Cannot find name 'o'.
tests/cases/conformance/types/spread/objectSpreadNegativeParse.ts(1,18): error TS1109: Expression expected.
tests/cases/conformance/types/spread/objectSpreadNegativeParse.ts(2,12): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/objectSpreadNegativeParse.ts(2,15): error TS1109: Expression expected.
tests/cases/conformance/types/spread/objectSpreadNegativeParse.ts(2,16): error TS2304: Cannot find name 'o'.
tests/cases/conformance/types/spread/objectSpreadNegativeParse.ts(3,15): error TS2304: Cannot find name 'matchMedia'.
@ -9,13 +10,15 @@ tests/cases/conformance/types/spread/objectSpreadNegativeParse.ts(4,16): error T
tests/cases/conformance/types/spread/objectSpreadNegativeParse.ts(4,20): error TS1005: ',' expected.
==== tests/cases/conformance/types/spread/objectSpreadNegativeParse.ts (9 errors) ====
==== tests/cases/conformance/types/spread/objectSpreadNegativeParse.ts (10 errors) ====
let o7 = { ...o? };
~
!!! error TS2304: Cannot find name 'o'.
~
!!! error TS1109: Expression expected.
let o8 = { ...*o };
~~~~~
!!! error TS2698: Spread types may only be created from object types.
~
!!! error TS1109: Expression expected.
~

View File

@ -1,13 +1,24 @@
tests/cases/compiler/restInvalidArgumentType.ts(18,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(20,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(22,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(23,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(25,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(28,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(27,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(29,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(30,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(31,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(33,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(36,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(37,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(39,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(40,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(42,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(43,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(45,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(46,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(50,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(51,13): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restInvalidArgumentType.ts(53,13): error TS2700: Rest types may only be created from object types.
==== tests/cases/compiler/restInvalidArgumentType.ts (7 errors) ====
==== tests/cases/compiler/restInvalidArgumentType.ts (16 errors) ====
enum E { v1, v2 };
function f<T extends { b: string }>(p1: T, p2: T[]) {
var t: T;
@ -18,7 +29,14 @@ tests/cases/compiler/restInvalidArgumentType.ts(30,13): error TS2700: Rest types
var mapped: {[P in "b"]: T[P]};
var union_generic: T | { a: number };
var union_primitive: { a: number } | number;
var intersection_generic: T & { a: number };
var intersection_primitive: { a: number } & string;
var num: number;
var str: string;
var literal_string: "string";
var literal_number: 42;
var e: E;
var u: undefined;
var n: null;
@ -32,7 +50,6 @@ tests/cases/compiler/restInvalidArgumentType.ts(30,13): error TS2700: Rest types
var {...r3} = t; // Error, generic type paramter
~~
!!! error TS2700: Rest types may only be created from object types.
var {...r4} = i; // Error, index access
~~
!!! error TS2700: Rest types may only be created from object types.
@ -48,14 +65,42 @@ tests/cases/compiler/restInvalidArgumentType.ts(30,13): error TS2700: Rest types
var {...r8} = union_generic; // Error, union with generic type parameter
~~
!!! error TS2700: Rest types may only be created from object types.
var {...r9} = union_primitive; // Error, union with generic type parameter
~~
!!! error TS2700: Rest types may only be created from object types.
var {...r10} = intersection_generic; // Error, intersection with generic type parameter
~~~
!!! error TS2700: Rest types may only be created from object types.
var {...r11} = intersection_primitive; // Error, intersection with generic type parameter
~~~
!!! error TS2700: Rest types may only be created from object types.
var {...r14} = u; // OK
var {...r15} = n; // OK
var {...r12} = num; // Error
~~~
!!! error TS2700: Rest types may only be created from object types.
var {...r13} = str; // Error
~~~
!!! error TS2700: Rest types may only be created from object types.
var {...r14} = u; // error, undefined-only not allowed
~~~
!!! error TS2700: Rest types may only be created from object types.
var {...r15} = n; // error, null-only not allowed
~~~
!!! error TS2700: Rest types may only be created from object types.
var {...r16} = a; // OK
var {...r17} = literal_string; // Error
~~~
!!! error TS2700: Rest types may only be created from object types.
var {...r18} = literal_number; // Error
~~~
!!! error TS2700: Rest types may only be created from object types.
var {...r19} = e; // Error, enum
~~~
!!! error TS2700: Rest types may only be created from object types.
}

View File

@ -1,4 +1,6 @@
//// [restInvalidArgumentType.ts]
enum E { v1, v2 };
function f<T extends { b: string }>(p1: T, p2: T[]) {
var t: T;
@ -9,7 +11,14 @@ function f<T extends { b: string }>(p1: T, p2: T[]) {
var mapped: {[P in "b"]: T[P]};
var union_generic: T | { a: number };
var union_primitive: { a: number } | number;
var intersection_generic: T & { a: number };
var intersection_primitive: { a: number } & string;
var num: number;
var str: string;
var literal_string: "string";
var literal_number: 42;
var e: E;
var u: undefined;
var n: null;
@ -19,7 +28,6 @@ function f<T extends { b: string }>(p1: T, p2: T[]) {
var {...r1} = p1; // Error, generic type paramterre
var {...r2} = p2; // OK
var {...r3} = t; // Error, generic type paramter
var {...r4} = i; // Error, index access
var {...r5} = k; // Error, index
@ -27,13 +35,23 @@ function f<T extends { b: string }>(p1: T, p2: T[]) {
var {...r7} = mapped; // OK, non-generic mapped type
var {...r8} = union_generic; // Error, union with generic type parameter
var {...r9} = union_primitive; // Error, union with generic type parameter
var {...r10} = intersection_generic; // Error, intersection with generic type parameter
var {...r11} = intersection_primitive; // Error, intersection with generic type parameter
var {...r14} = u; // OK
var {...r15} = n; // OK
var {...r12} = num; // Error
var {...r13} = str; // Error
var {...r14} = u; // error, undefined-only not allowed
var {...r15} = n; // error, null-only not allowed
var {...r16} = a; // OK
var {...r17} = literal_string; // Error
var {...r18} = literal_number; // Error
var {...r19} = e; // Error, enum
}
@ -47,6 +65,12 @@ var __rest = (this && this.__rest) || function (s, e) {
t[p[i]] = s[p[i]];
return t;
};
var E;
(function (E) {
E[E["v1"] = 0] = "v1";
E[E["v2"] = 1] = "v2";
})(E || (E = {}));
;
function f(p1, p2) {
var t;
var i;
@ -54,7 +78,14 @@ function f(p1, p2) {
var mapped_generic;
var mapped;
var union_generic;
var union_primitive;
var intersection_generic;
var intersection_primitive;
var num;
var str;
var literal_string;
var literal_number;
var e;
var u;
var n;
var a;
@ -66,8 +97,15 @@ function f(p1, p2) {
var r6 = __rest(mapped_generic, []); // Error, generic mapped object type
var r7 = __rest(mapped, []); // OK, non-generic mapped type
var r8 = __rest(union_generic, []); // Error, union with generic type parameter
var r9 = __rest(union_primitive, []); // Error, union with generic type parameter
var r10 = __rest(intersection_generic, []); // Error, intersection with generic type parameter
var r14 = __rest(u, []); // OK
var r15 = __rest(n, []); // OK
var r11 = __rest(intersection_primitive, []); // Error, intersection with generic type parameter
var r12 = __rest(num, []); // Error
var r13 = __rest(str, []); // Error
var r14 = __rest(u, []); // error, undefined-only not allowed
var r15 = __rest(n, []); // error, null-only not allowed
var r16 = __rest(a, []); // OK
var r17 = __rest(literal_string, []); // Error
var r18 = __rest(literal_number, []); // Error
var r19 = __rest(e, []); // Error, enum
}

View File

@ -7,15 +7,7 @@ var {...rest2 } = undefinedUnion;
declare const nullUnion: { n: number } | null;
var rest3: { n: number };
var {...rest3 } = nullUnion;
declare const nullAndUndefinedUnion: null | undefined;
var rest4: { };
var {...rest4 } = nullAndUndefinedUnion;
declare const unionWithIntersection: ({ n: number } & { s: string }) & undefined | null;
var rest5: { n: number, s: string };
var {...rest5 } = unionWithIntersection;
//// [restUnion2.js]
var __rest = (this && this.__rest) || function (s, e) {
@ -31,7 +23,3 @@ var rest2;
var rest2 = __rest(undefinedUnion, []);
var rest3;
var rest3 = __rest(nullUnion, []);
var rest4;
var rest4 = __rest(nullAndUndefinedUnion, []);
var rest5;
var rest5 = __rest(unionWithIntersection, []);

View File

@ -24,28 +24,3 @@ var {...rest3 } = nullUnion;
>rest3 : Symbol(rest3, Decl(restUnion2.ts, 6, 3), Decl(restUnion2.ts, 7, 5))
>nullUnion : Symbol(nullUnion, Decl(restUnion2.ts, 5, 13))
declare const nullAndUndefinedUnion: null | undefined;
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(restUnion2.ts, 10, 13))
var rest4: { };
>rest4 : Symbol(rest4, Decl(restUnion2.ts, 11, 3), Decl(restUnion2.ts, 12, 5))
var {...rest4 } = nullAndUndefinedUnion;
>rest4 : Symbol(rest4, Decl(restUnion2.ts, 11, 3), Decl(restUnion2.ts, 12, 5))
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(restUnion2.ts, 10, 13))
declare const unionWithIntersection: ({ n: number } & { s: string }) & undefined | null;
>unionWithIntersection : Symbol(unionWithIntersection, Decl(restUnion2.ts, 14, 13))
>n : Symbol(n, Decl(restUnion2.ts, 14, 39))
>s : Symbol(s, Decl(restUnion2.ts, 14, 55))
var rest5: { n: number, s: string };
>rest5 : Symbol(rest5, Decl(restUnion2.ts, 15, 3), Decl(restUnion2.ts, 16, 5))
>n : Symbol(n, Decl(restUnion2.ts, 15, 12))
>s : Symbol(s, Decl(restUnion2.ts, 15, 23))
var {...rest5 } = unionWithIntersection;
>rest5 : Symbol(rest5, Decl(restUnion2.ts, 15, 3), Decl(restUnion2.ts, 16, 5))
>unionWithIntersection : Symbol(unionWithIntersection, Decl(restUnion2.ts, 14, 13))

View File

@ -25,30 +25,3 @@ var {...rest3 } = nullUnion;
>rest3 : { n: number; }
>nullUnion : { n: number; } | null
declare const nullAndUndefinedUnion: null | undefined;
>nullAndUndefinedUnion : null | undefined
>null : null
var rest4: { };
>rest4 : {}
var {...rest4 } = nullAndUndefinedUnion;
>rest4 : {}
>nullAndUndefinedUnion : null | undefined
declare const unionWithIntersection: ({ n: number } & { s: string }) & undefined | null;
>unionWithIntersection : ({ n: number; } & { s: string; } & undefined) | null
>n : number
>s : string
>null : null
var rest5: { n: number, s: string };
>rest5 : { n: number; s: string; }
>n : number
>s : string
var {...rest5 } = unionWithIntersection;
>rest5 : { n: number; s: string; }
>unionWithIntersection : ({ n: number; } & { s: string; } & undefined) | null

View File

@ -0,0 +1,17 @@
tests/cases/compiler/restUnion3.ts(3,9): error TS2700: Rest types may only be created from object types.
tests/cases/compiler/restUnion3.ts(7,9): error TS2700: Rest types may only be created from object types.
==== tests/cases/compiler/restUnion3.ts (2 errors) ====
declare const nullAndUndefinedUnion: null | undefined;
var rest4: { };
var {...rest4 } = nullAndUndefinedUnion;
~~~~~
!!! error TS2700: Rest types may only be created from object types.
declare const unionWithIntersection: ({ n: number } & { s: string }) & undefined | null;
var rest5: { n: number, s: string };
var {...rest5 } = unionWithIntersection;
~~~~~
!!! error TS2700: Rest types may only be created from object types.

View File

@ -0,0 +1,25 @@
//// [restUnion3.ts]
declare const nullAndUndefinedUnion: null | undefined;
var rest4: { };
var {...rest4 } = nullAndUndefinedUnion;
declare const unionWithIntersection: ({ n: number } & { s: string }) & undefined | null;
var rest5: { n: number, s: string };
var {...rest5 } = unionWithIntersection;
//// [restUnion3.js]
"use strict";
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
t[p[i]] = s[p[i]];
return t;
};
var rest4;
var rest4 = __rest(nullAndUndefinedUnion, []);
var rest5;
var rest5 = __rest(unionWithIntersection, []);

View File

@ -1,13 +1,24 @@
tests/cases/compiler/spreadInvalidArgumentType.ts(19,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(21,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(23,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(24,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(26,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(29,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(31,17): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(30,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(32,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(33,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(34,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(35,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(38,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(39,16): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(41,17): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(42,17): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(44,17): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(45,17): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(47,17): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(48,17): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(52,17): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(53,17): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/spreadInvalidArgumentType.ts(55,17): error TS2698: Spread types may only be created from object types.
==== tests/cases/compiler/spreadInvalidArgumentType.ts (7 errors) ====
==== tests/cases/compiler/spreadInvalidArgumentType.ts (16 errors) ====
enum E { v1, v2 };
function f<T extends { b: string }>(p1: T, p2: T[]) {
var t: T;
@ -18,14 +29,23 @@ tests/cases/compiler/spreadInvalidArgumentType.ts(31,17): error TS2698: Spread t
var mapped: {[P in "b"]: T[P]};
var union_generic: T | { a: number };
var union_primitive: { a: number } | number;
var intersection_generic: T & { a: number };
var intersection_primitive: { a: number } | string;
var num: number;
var str: number;
var literal_string: "string";
var literal_number: 42;
var u: undefined;
var n: null;
var a: any;
var e: E;
var o1 = { ...p1 }; // Error, generic type paramterre
~~~~~
!!! error TS2698: Spread types may only be created from object types.
@ -33,14 +53,12 @@ tests/cases/compiler/spreadInvalidArgumentType.ts(31,17): error TS2698: Spread t
var o3 = { ...t }; // Error, generic type paramter
~~~~
!!! error TS2698: Spread types may only be created from object types.
var o4 = { ...i }; // Error, index access
~~~~
!!! error TS2698: Spread types may only be created from object types.
var o5 = { ...k }; // Error, index
~~~~
!!! error TS2698: Spread types may only be created from object types.
var o6 = { ...mapped_generic }; // Error, generic mapped object type
~~~~~~~~~~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
@ -49,14 +67,42 @@ tests/cases/compiler/spreadInvalidArgumentType.ts(31,17): error TS2698: Spread t
var o8 = { ...union_generic }; // Error, union with generic type parameter
~~~~~~~~~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
var o9 = { ...union_primitive }; // Error, union with generic type parameter
~~~~~~~~~~~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
var o10 = { ...intersection_generic }; // Error, intersection with generic type parameter
~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
var o11 = { ...intersection_primitive }; // Error, intersection with generic type parameter
~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
var o14 = { ...u }; // OK
var o15 = { ...n }; // OK
var o12 = { ...num }; // Error
~~~~~~
!!! error TS2698: Spread types may only be created from object types.
var o13 = { ...str }; // Error
~~~~~~
!!! error TS2698: Spread types may only be created from object types.
var o14 = { ...u }; // error, undefined-only not allowed
~~~~
!!! error TS2698: Spread types may only be created from object types.
var o15 = { ...n }; // error, null-only not allowed
~~~~
!!! error TS2698: Spread types may only be created from object types.
var o16 = { ...a }; // OK
var o17 = { ...literal_string }; // Error
~~~~~~~~~~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
var o18 = { ...literal_number }; // Error
~~~~~~~~~~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
var o19 = { ...e }; // Error, enum
~~~~
!!! error TS2698: Spread types may only be created from object types.
}

View File

@ -1,4 +1,6 @@
//// [spreadInvalidArgumentType.ts]
enum E { v1, v2 };
function f<T extends { b: string }>(p1: T, p2: T[]) {
var t: T;
@ -9,32 +11,49 @@ function f<T extends { b: string }>(p1: T, p2: T[]) {
var mapped: {[P in "b"]: T[P]};
var union_generic: T | { a: number };
var union_primitive: { a: number } | number;
var intersection_generic: T & { a: number };
var intersection_primitive: { a: number } | string;
var num: number;
var str: number;
var literal_string: "string";
var literal_number: 42;
var u: undefined;
var n: null;
var a: any;
var e: E;
var o1 = { ...p1 }; // Error, generic type paramterre
var o2 = { ...p2 }; // OK
var o3 = { ...t }; // Error, generic type paramter
var o4 = { ...i }; // Error, index access
var o5 = { ...k }; // Error, index
var o6 = { ...mapped_generic }; // Error, generic mapped object type
var o7 = { ...mapped }; // OK, non-generic mapped type
var o8 = { ...union_generic }; // Error, union with generic type parameter
var o9 = { ...union_primitive }; // Error, union with generic type parameter
var o10 = { ...intersection_generic }; // Error, intersection with generic type parameter
var o11 = { ...intersection_primitive }; // Error, intersection with generic type parameter
var o14 = { ...u }; // OK
var o15 = { ...n }; // OK
var o12 = { ...num }; // Error
var o13 = { ...str }; // Error
var o14 = { ...u }; // error, undefined-only not allowed
var o15 = { ...n }; // error, null-only not allowed
var o16 = { ...a }; // OK
var o17 = { ...literal_string }; // Error
var o18 = { ...literal_number }; // Error
var o19 = { ...e }; // Error, enum
}
@ -47,6 +66,12 @@ var __assign = (this && this.__assign) || Object.assign || function(t) {
}
return t;
};
var E;
(function (E) {
E[E["v1"] = 0] = "v1";
E[E["v2"] = 1] = "v2";
})(E || (E = {}));
;
function f(p1, p2) {
var t;
var i;
@ -54,10 +79,17 @@ function f(p1, p2) {
var mapped_generic;
var mapped;
var union_generic;
var union_primitive;
var intersection_generic;
var intersection_primitive;
var num;
var str;
var literal_string;
var literal_number;
var u;
var n;
var a;
var e;
var o1 = __assign({}, p1); // Error, generic type paramterre
var o2 = __assign({}, p2); // OK
var o3 = __assign({}, t); // Error, generic type paramter
@ -66,8 +98,15 @@ function f(p1, p2) {
var o6 = __assign({}, mapped_generic); // Error, generic mapped object type
var o7 = __assign({}, mapped); // OK, non-generic mapped type
var o8 = __assign({}, union_generic); // Error, union with generic type parameter
var o9 = __assign({}, union_primitive); // Error, union with generic type parameter
var o10 = __assign({}, intersection_generic); // Error, intersection with generic type parameter
var o14 = __assign({}, u); // OK
var o15 = __assign({}, n); // OK
var o11 = __assign({}, intersection_primitive); // Error, intersection with generic type parameter
var o12 = __assign({}, num); // Error
var o13 = __assign({}, str); // Error
var o14 = __assign({}, u); // error, undefined-only not allowed
var o15 = __assign({}, n); // error, null-only not allowed
var o16 = __assign({}, a); // OK
var o17 = __assign({}, literal_string); // Error
var o18 = __assign({}, literal_number); // Error
var o19 = __assign({}, e); // Error, enum
}

View File

@ -1,7 +1,6 @@
//// [spreadUnion2.ts]
declare const undefinedUnion: { a: number } | undefined;
declare const nullUnion: { b: number } | null;
declare const nullAndUndefinedUnion: null | undefined;
var o1: { a?: number | undefined };
var o1 = { ...undefinedUnion };
@ -19,8 +18,6 @@ var o4 = { ...undefinedUnion, ...undefinedUnion };
var o5: { b?: number | undefined };
var o5 = { ...nullUnion, ...nullUnion };
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
var o7 = { ...nullAndUndefinedUnion };
//// [spreadUnion2.js]
@ -43,5 +40,3 @@ var o4;
var o4 = __assign({}, undefinedUnion, undefinedUnion);
var o5;
var o5 = __assign({}, nullUnion, nullUnion);
var o6 = __assign({}, nullAndUndefinedUnion, nullAndUndefinedUnion);
var o7 = __assign({}, nullAndUndefinedUnion);

View File

@ -7,64 +7,53 @@ declare const nullUnion: { b: number } | null;
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
>b : Symbol(b, Decl(spreadUnion2.ts, 1, 26))
declare const nullAndUndefinedUnion: null | undefined;
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(spreadUnion2.ts, 2, 13))
var o1: { a?: number | undefined };
>o1 : Symbol(o1, Decl(spreadUnion2.ts, 4, 3), Decl(spreadUnion2.ts, 5, 3))
>a : Symbol(a, Decl(spreadUnion2.ts, 4, 9))
>o1 : Symbol(o1, Decl(spreadUnion2.ts, 3, 3), Decl(spreadUnion2.ts, 4, 3))
>a : Symbol(a, Decl(spreadUnion2.ts, 3, 9))
var o1 = { ...undefinedUnion };
>o1 : Symbol(o1, Decl(spreadUnion2.ts, 4, 3), Decl(spreadUnion2.ts, 5, 3))
>o1 : Symbol(o1, Decl(spreadUnion2.ts, 3, 3), Decl(spreadUnion2.ts, 4, 3))
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
var o2: { b?: number | undefined };
>o2 : Symbol(o2, Decl(spreadUnion2.ts, 7, 3), Decl(spreadUnion2.ts, 8, 3))
>b : Symbol(b, Decl(spreadUnion2.ts, 7, 9))
>o2 : Symbol(o2, Decl(spreadUnion2.ts, 6, 3), Decl(spreadUnion2.ts, 7, 3))
>b : Symbol(b, Decl(spreadUnion2.ts, 6, 9))
var o2 = { ...nullUnion };
>o2 : Symbol(o2, Decl(spreadUnion2.ts, 7, 3), Decl(spreadUnion2.ts, 8, 3))
>o2 : Symbol(o2, Decl(spreadUnion2.ts, 6, 3), Decl(spreadUnion2.ts, 7, 3))
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
var o3: { a?: number | undefined, b?: number | undefined };
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3), Decl(spreadUnion2.ts, 12, 3))
>a : Symbol(a, Decl(spreadUnion2.ts, 10, 9))
>b : Symbol(b, Decl(spreadUnion2.ts, 10, 33))
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 9, 3), Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3))
>a : Symbol(a, Decl(spreadUnion2.ts, 9, 9))
>b : Symbol(b, Decl(spreadUnion2.ts, 9, 33))
var o3 = { ...undefinedUnion, ...nullUnion };
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3), Decl(spreadUnion2.ts, 12, 3))
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 9, 3), Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3))
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
var o3 = { ...nullUnion, ...undefinedUnion };
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3), Decl(spreadUnion2.ts, 12, 3))
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 9, 3), Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3))
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
var o4: { a?: number | undefined };
>o4 : Symbol(o4, Decl(spreadUnion2.ts, 14, 3), Decl(spreadUnion2.ts, 15, 3))
>a : Symbol(a, Decl(spreadUnion2.ts, 14, 9))
>o4 : Symbol(o4, Decl(spreadUnion2.ts, 13, 3), Decl(spreadUnion2.ts, 14, 3))
>a : Symbol(a, Decl(spreadUnion2.ts, 13, 9))
var o4 = { ...undefinedUnion, ...undefinedUnion };
>o4 : Symbol(o4, Decl(spreadUnion2.ts, 14, 3), Decl(spreadUnion2.ts, 15, 3))
>o4 : Symbol(o4, Decl(spreadUnion2.ts, 13, 3), Decl(spreadUnion2.ts, 14, 3))
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
var o5: { b?: number | undefined };
>o5 : Symbol(o5, Decl(spreadUnion2.ts, 17, 3), Decl(spreadUnion2.ts, 18, 3))
>b : Symbol(b, Decl(spreadUnion2.ts, 17, 9))
>o5 : Symbol(o5, Decl(spreadUnion2.ts, 16, 3), Decl(spreadUnion2.ts, 17, 3))
>b : Symbol(b, Decl(spreadUnion2.ts, 16, 9))
var o5 = { ...nullUnion, ...nullUnion };
>o5 : Symbol(o5, Decl(spreadUnion2.ts, 17, 3), Decl(spreadUnion2.ts, 18, 3))
>o5 : Symbol(o5, Decl(spreadUnion2.ts, 16, 3), Decl(spreadUnion2.ts, 17, 3))
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
>o6 : Symbol(o6, Decl(spreadUnion2.ts, 20, 3))
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(spreadUnion2.ts, 2, 13))
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(spreadUnion2.ts, 2, 13))
var o7 = { ...nullAndUndefinedUnion };
>o7 : Symbol(o7, Decl(spreadUnion2.ts, 21, 3))
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(spreadUnion2.ts, 2, 13))

View File

@ -8,10 +8,6 @@ declare const nullUnion: { b: number } | null;
>b : number
>null : null
declare const nullAndUndefinedUnion: null | undefined;
>nullAndUndefinedUnion : null | undefined
>null : null
var o1: { a?: number | undefined };
>o1 : { a?: number | undefined; }
>a : number | undefined
@ -67,14 +63,4 @@ var o5 = { ...nullUnion, ...nullUnion };
>nullUnion : { b: number; } | null
>nullUnion : { b: number; } | null
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
>o6 : {}
>{ ...nullAndUndefinedUnion, ...nullAndUndefinedUnion } : {}
>nullAndUndefinedUnion : null | undefined
>nullAndUndefinedUnion : null | undefined
var o7 = { ...nullAndUndefinedUnion };
>o7 : {}
>{ ...nullAndUndefinedUnion } : {}
>nullAndUndefinedUnion : null | undefined

View File

@ -2,11 +2,13 @@ tests/cases/conformance/types/spread/spreadUnion3.ts(2,5): error TS2322: Type '{
Types of property 'y' are incompatible.
Type 'string | number' is not assignable to type 'string'.
Type 'number' is not assignable to type 'string'.
tests/cases/conformance/types/spread/spreadUnion3.ts(9,23): error TS2339: Property 'a' does not exist on type '{} | {} | { a: number; }'.
Property 'a' does not exist on type '{}'.
tests/cases/conformance/types/spread/spreadUnion3.ts(9,9): error TS2322: Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.
tests/cases/conformance/types/spread/spreadUnion3.ts(17,11): error TS2698: Spread types may only be created from object types.
tests/cases/conformance/types/spread/spreadUnion3.ts(18,11): error TS2698: Spread types may only be created from object types.
==== tests/cases/conformance/types/spread/spreadUnion3.ts (2 errors) ====
==== tests/cases/conformance/types/spread/spreadUnion3.ts (4 errors) ====
function f(x: { y: string } | undefined): { y: string } {
return { y: 123, ...x } // y: string | number
~~~~~~~~~~~~~~~~~~~~~~~
@ -21,11 +23,20 @@ tests/cases/conformance/types/spread/spreadUnion3.ts(9,23): error TS2339: Proper
function g(t?: { a: number } | null): void {
let b = { ...t };
let c: number = b.a; // might not have 'a'
~
!!! error TS2339: Property 'a' does not exist on type '{} | {} | { a: number; }'.
!!! error TS2339: Property 'a' does not exist on type '{}'.
~
!!! error TS2322: Type 'number | undefined' is not assignable to type 'number'.
!!! error TS2322: Type 'undefined' is not assignable to type 'number'.
}
g()
g(undefined)
g(null)
// spreading nothing but null and undefined is not allowed
declare const nullAndUndefinedUnion: null | undefined;
var x = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.
var y = { ...nullAndUndefinedUnion };
~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2698: Spread types may only be created from object types.

View File

@ -12,6 +12,11 @@ function g(t?: { a: number } | null): void {
g()
g(undefined)
g(null)
// spreading nothing but null and undefined is not allowed
declare const nullAndUndefinedUnion: null | undefined;
var x = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
var y = { ...nullAndUndefinedUnion };
//// [spreadUnion3.js]
@ -34,3 +39,5 @@ function g(t) {
g();
g(undefined);
g(null);
var x = __assign({}, nullAndUndefinedUnion, nullAndUndefinedUnion);
var y = __assign({}, nullAndUndefinedUnion);

View File

@ -1,3 +1,5 @@
enum E { v1, v2 };
function f<T extends { b: string }>(p1: T, p2: T[]) {
var t: T;
@ -8,7 +10,14 @@ function f<T extends { b: string }>(p1: T, p2: T[]) {
var mapped: {[P in "b"]: T[P]};
var union_generic: T | { a: number };
var union_primitive: { a: number } | number;
var intersection_generic: T & { a: number };
var intersection_primitive: { a: number } & string;
var num: number;
var str: string;
var literal_string: "string";
var literal_number: 42;
var e: E;
var u: undefined;
var n: null;
@ -18,7 +27,6 @@ function f<T extends { b: string }>(p1: T, p2: T[]) {
var {...r1} = p1; // Error, generic type paramterre
var {...r2} = p2; // OK
var {...r3} = t; // Error, generic type paramter
var {...r4} = i; // Error, index access
var {...r5} = k; // Error, index
@ -26,11 +34,21 @@ function f<T extends { b: string }>(p1: T, p2: T[]) {
var {...r7} = mapped; // OK, non-generic mapped type
var {...r8} = union_generic; // Error, union with generic type parameter
var {...r9} = union_primitive; // Error, union with generic type parameter
var {...r10} = intersection_generic; // Error, intersection with generic type parameter
var {...r11} = intersection_primitive; // Error, intersection with generic type parameter
var {...r14} = u; // OK
var {...r15} = n; // OK
var {...r12} = num; // Error
var {...r13} = str; // Error
var {...r14} = u; // error, undefined-only not allowed
var {...r15} = n; // error, null-only not allowed
var {...r16} = a; // OK
var {...r17} = literal_string; // Error
var {...r18} = literal_number; // Error
var {...r19} = e; // Error, enum
}

View File

@ -8,12 +8,3 @@ var {...rest2 } = undefinedUnion;
declare const nullUnion: { n: number } | null;
var rest3: { n: number };
var {...rest3 } = nullUnion;
declare const nullAndUndefinedUnion: null | undefined;
var rest4: { };
var {...rest4 } = nullAndUndefinedUnion;
declare const unionWithIntersection: ({ n: number } & { s: string }) & undefined | null;
var rest5: { n: number, s: string };
var {...rest5 } = unionWithIntersection;

View File

@ -0,0 +1,8 @@
// @strict: true
declare const nullAndUndefinedUnion: null | undefined;
var rest4: { };
var {...rest4 } = nullAndUndefinedUnion;
declare const unionWithIntersection: ({ n: number } & { s: string }) & undefined | null;
var rest5: { n: number, s: string };
var {...rest5 } = unionWithIntersection;

View File

@ -1,3 +1,5 @@
enum E { v1, v2 };
function f<T extends { b: string }>(p1: T, p2: T[]) {
var t: T;
@ -8,30 +10,47 @@ function f<T extends { b: string }>(p1: T, p2: T[]) {
var mapped: {[P in "b"]: T[P]};
var union_generic: T | { a: number };
var union_primitive: { a: number } | number;
var intersection_generic: T & { a: number };
var intersection_primitive: { a: number } | string;
var num: number;
var str: number;
var literal_string: "string";
var literal_number: 42;
var u: undefined;
var n: null;
var a: any;
var e: E;
var o1 = { ...p1 }; // Error, generic type paramterre
var o2 = { ...p2 }; // OK
var o3 = { ...t }; // Error, generic type paramter
var o4 = { ...i }; // Error, index access
var o5 = { ...k }; // Error, index
var o6 = { ...mapped_generic }; // Error, generic mapped object type
var o7 = { ...mapped }; // OK, non-generic mapped type
var o8 = { ...union_generic }; // Error, union with generic type parameter
var o9 = { ...union_primitive }; // Error, union with generic type parameter
var o10 = { ...intersection_generic }; // Error, intersection with generic type parameter
var o11 = { ...intersection_primitive }; // Error, intersection with generic type parameter
var o14 = { ...u }; // OK
var o15 = { ...n }; // OK
var o12 = { ...num }; // Error
var o13 = { ...str }; // Error
var o14 = { ...u }; // error, undefined-only not allowed
var o15 = { ...n }; // error, null-only not allowed
var o16 = { ...a }; // OK
var o17 = { ...literal_string }; // Error
var o18 = { ...literal_number }; // Error
var o19 = { ...e }; // Error, enum
}

View File

@ -39,12 +39,26 @@ getter.a = 12;
// functions result in { }
let spreadFunc = { ...(function () { }) };
// boolean && T results in Partial<T>
function conditionalSpreadBoolean(b: boolean) : { x?: number | undefined, y?: number | undefined } {
return { ...b && { x: 1, y: 2 } };
type Header = { head: string, body: string, authToken: string }
function from16326(this: { header: Header }, header: Header, authToken: string): Header {
return {
...this.header,
...header,
...authToken && { authToken }
}
}
function conditionalSpreadNumber(nt: number): { x?: number | undefined, y: number } {
// boolean && T results in Partial<T>
function conditionalSpreadBoolean(b: boolean) : { x: number, y: number } {
let o = { x: 12, y: 13 }
o = {
...o,
...b && { x: 14 }
}
let o2 = { ...b && { x: 21 }}
return o;
}
function conditionalSpreadNumber(nt: number): { x: number, y: number } {
let o = { x: 15, y: 16 }
o = {
...o,
...nt && { x: nt }
@ -52,8 +66,8 @@ function conditionalSpreadNumber(nt: number): { x?: number | undefined, y: numbe
let o2 = { ...nt && { x: nt }}
return o;
}
function conditionalSpreadString(st: string): { x?: string | undefined, y: number } {
let o = { x: 'hi', y: 13 }
function conditionalSpreadString(st: string): { x: string, y: number } {
let o = { x: 'hi', y: 17 }
o = {
...o,
...st && { x: st }
@ -61,8 +75,6 @@ function conditionalSpreadString(st: string): { x?: string | undefined, y: numbe
let o2 = { ...st && { x: st }}
return o;
}
// other booleans result in { }
let spreadBool = { ... true }
// any results in any
let anything: any;

View File

@ -29,7 +29,13 @@ spread = b; // error, missing 's'
let duplicated = { b: 'bad', ...o, b: 'bad', ...o2, b: 'bad' }
let duplicatedSpread = { ...o, ...o }
// primitives are skipped
// primitives are not allowed, except for falsy ones
let spreadNum = { ...12 };
let spreadSum = { ...1 + 1 };
let spreadZero = { ...0 };
spreadZero.toFixed(); // error, no methods even from a falsy number
let spreadBool = { ...true };
spreadBool.valueOf();
let spreadStr = { ...'foo' };
spreadStr.length; // error, no 'length'
spreadStr.charAt(1); // error, no methods either

View File

@ -2,7 +2,6 @@
declare const undefinedUnion: { a: number } | undefined;
declare const nullUnion: { b: number } | null;
declare const nullAndUndefinedUnion: null | undefined;
var o1: { a?: number | undefined };
var o1 = { ...undefinedUnion };
@ -20,5 +19,3 @@ var o4 = { ...undefinedUnion, ...undefinedUnion };
var o5: { b?: number | undefined };
var o5 = { ...nullUnion, ...nullUnion };
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
var o7 = { ...nullAndUndefinedUnion };

View File

@ -12,3 +12,8 @@ function g(t?: { a: number } | null): void {
g()
g(undefined)
g(null)
// spreading nothing but null and undefined is not allowed
declare const nullAndUndefinedUnion: null | undefined;
var x = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
var y = { ...nullAndUndefinedUnion };