diff --git a/tests/baselines/reference/objectSpread.js b/tests/baselines/reference/objectSpread.js index a09f5aa0fbb..efb73bcb353 100644 --- a/tests/baselines/reference/objectSpread.js +++ b/tests/baselines/reference/objectSpread.js @@ -35,14 +35,16 @@ let getter: { a: number, c: number } = { ...op, c: 7 } getter.a = 12; -// null, undefined, functions and primitives result in { } +// null, undefined, functions and primitives besides string result in { } let spreadNull = { ...null }; let spreadUndefind = { ...undefined }; let spreadNum = { ...12 }; -let spreadStr = { ...'foo' }; let spreadBool = { ...false }; let spreadFunc = { ...(function () { }) }; +// strings get a numeric indexer: [n: number]: string +let spreadStr = { ...'foo' }; + // methods are not enumerable class C { p = 1; m() { } } let c: C = new C() @@ -128,13 +130,14 @@ var propertyNested = __assign({ a: __assign({}, o) }); var op = { get a() { return 6; } }; var getter = __assign({}, op, { c: 7 }); getter.a = 12; -// null, undefined, functions and primitives result in { } +// null, undefined, functions and primitives besides string result in { } var spreadNull = __assign({}, null); var spreadUndefind = __assign({}, undefined); var spreadNum = __assign({}, 12); -var spreadStr = __assign({}, 'foo'); var spreadBool = __assign({}, false); var spreadFunc = __assign({}, (function () { })); +// strings get a numeric indexer: [n: number]: string +var spreadStr = __assign({}, 'foo'); // methods are not enumerable var C = (function () { function C() { diff --git a/tests/baselines/reference/objectSpread.symbols b/tests/baselines/reference/objectSpread.symbols index edb0b4c2f08..d23016ddb1e 100644 --- a/tests/baselines/reference/objectSpread.symbols +++ b/tests/baselines/reference/objectSpread.symbols @@ -150,7 +150,7 @@ getter.a = 12; >getter : Symbol(getter, Decl(objectSpread.ts, 32, 3)) >a : Symbol(a, Decl(objectSpread.ts, 32, 13)) -// null, undefined, functions and primitives result in { } +// null, undefined, functions and primitives besides string result in { } let spreadNull = { ...null }; >spreadNull : Symbol(spreadNull, Decl(objectSpread.ts, 37, 3)) @@ -160,214 +160,215 @@ let spreadUndefind = { ...undefined }; let spreadNum = { ...12 }; >spreadNum : Symbol(spreadNum, Decl(objectSpread.ts, 39, 3)) -let spreadStr = { ...'foo' }; ->spreadStr : Symbol(spreadStr, Decl(objectSpread.ts, 40, 3)) - let spreadBool = { ...false }; ->spreadBool : Symbol(spreadBool, Decl(objectSpread.ts, 41, 3)) +>spreadBool : Symbol(spreadBool, Decl(objectSpread.ts, 40, 3)) let spreadFunc = { ...(function () { }) }; ->spreadFunc : Symbol(spreadFunc, Decl(objectSpread.ts, 42, 3)) +>spreadFunc : Symbol(spreadFunc, Decl(objectSpread.ts, 41, 3)) + +// strings get a numeric indexer: [n: number]: string +let spreadStr = { ...'foo' }; +>spreadStr : Symbol(spreadStr, Decl(objectSpread.ts, 44, 3)) // methods are not enumerable class C { p = 1; m() { } } ->C : Symbol(C, Decl(objectSpread.ts, 42, 42)) ->p : Symbol(C.p, Decl(objectSpread.ts, 45, 9)) ->m : Symbol(C.m, Decl(objectSpread.ts, 45, 16)) +>C : Symbol(C, Decl(objectSpread.ts, 44, 29)) +>p : Symbol(C.p, Decl(objectSpread.ts, 47, 9)) +>m : Symbol(C.m, Decl(objectSpread.ts, 47, 16)) let c: C = new C() ->c : Symbol(c, Decl(objectSpread.ts, 46, 3)) ->C : Symbol(C, Decl(objectSpread.ts, 42, 42)) ->C : Symbol(C, Decl(objectSpread.ts, 42, 42)) +>c : Symbol(c, Decl(objectSpread.ts, 48, 3)) +>C : Symbol(C, Decl(objectSpread.ts, 44, 29)) +>C : Symbol(C, Decl(objectSpread.ts, 44, 29)) let spreadC: { p: number } = { ...c } ->spreadC : Symbol(spreadC, Decl(objectSpread.ts, 47, 3)) ->p : Symbol(p, Decl(objectSpread.ts, 47, 14)) +>spreadC : Symbol(spreadC, Decl(objectSpread.ts, 49, 3)) +>p : Symbol(p, Decl(objectSpread.ts, 49, 14)) // own methods are enumerable let cplus: { p: number, plus(): void } = { ...c, plus() { return this.p + 1; } }; ->cplus : Symbol(cplus, Decl(objectSpread.ts, 50, 3)) ->p : Symbol(p, Decl(objectSpread.ts, 50, 12)) ->plus : Symbol(plus, Decl(objectSpread.ts, 50, 23)) ->plus : Symbol(plus, Decl(objectSpread.ts, 50, 48)) +>cplus : Symbol(cplus, Decl(objectSpread.ts, 52, 3)) +>p : Symbol(p, Decl(objectSpread.ts, 52, 12)) +>plus : Symbol(plus, Decl(objectSpread.ts, 52, 23)) +>plus : Symbol(plus, Decl(objectSpread.ts, 52, 48)) cplus.plus(); ->cplus.plus : Symbol(plus, Decl(objectSpread.ts, 50, 23)) ->cplus : Symbol(cplus, Decl(objectSpread.ts, 50, 3)) ->plus : Symbol(plus, Decl(objectSpread.ts, 50, 23)) +>cplus.plus : Symbol(plus, Decl(objectSpread.ts, 52, 23)) +>cplus : Symbol(cplus, Decl(objectSpread.ts, 52, 3)) +>plus : Symbol(plus, Decl(objectSpread.ts, 52, 23)) // new field's type conflicting with existing field is OK let changeTypeAfter: { a: string, b: string } = ->changeTypeAfter : Symbol(changeTypeAfter, Decl(objectSpread.ts, 54, 3)) ->a : Symbol(a, Decl(objectSpread.ts, 54, 22)) ->b : Symbol(b, Decl(objectSpread.ts, 54, 33)) +>changeTypeAfter : Symbol(changeTypeAfter, Decl(objectSpread.ts, 56, 3)) +>a : Symbol(a, Decl(objectSpread.ts, 56, 22)) +>b : Symbol(b, Decl(objectSpread.ts, 56, 33)) { ...o, a: 'wrong type?' } ->a : Symbol(a, Decl(objectSpread.ts, 55, 11)) +>a : Symbol(a, Decl(objectSpread.ts, 57, 11)) let changeTypeBefore: { a: number, b: string } = ->changeTypeBefore : Symbol(changeTypeBefore, Decl(objectSpread.ts, 56, 3)) ->a : Symbol(a, Decl(objectSpread.ts, 56, 23)) ->b : Symbol(b, Decl(objectSpread.ts, 56, 34)) +>changeTypeBefore : Symbol(changeTypeBefore, Decl(objectSpread.ts, 58, 3)) +>a : Symbol(a, Decl(objectSpread.ts, 58, 23)) +>b : Symbol(b, Decl(objectSpread.ts, 58, 34)) { a: 'wrong type?', ...o }; ->a : Symbol(a, Decl(objectSpread.ts, 57, 5)) +>a : Symbol(a, Decl(objectSpread.ts, 59, 5)) let changeTypeBoth: { a: string, b: number } = ->changeTypeBoth : Symbol(changeTypeBoth, Decl(objectSpread.ts, 58, 3)) ->a : Symbol(a, Decl(objectSpread.ts, 58, 21)) ->b : Symbol(b, Decl(objectSpread.ts, 58, 32)) +>changeTypeBoth : Symbol(changeTypeBoth, Decl(objectSpread.ts, 60, 3)) +>a : Symbol(a, Decl(objectSpread.ts, 60, 21)) +>b : Symbol(b, Decl(objectSpread.ts, 60, 32)) { ...o, ...swap }; // optional let definiteBoolean: { sn: boolean }; ->definiteBoolean : Symbol(definiteBoolean, Decl(objectSpread.ts, 62, 3)) ->sn : Symbol(sn, Decl(objectSpread.ts, 62, 22)) +>definiteBoolean : Symbol(definiteBoolean, Decl(objectSpread.ts, 64, 3)) +>sn : Symbol(sn, Decl(objectSpread.ts, 64, 22)) let definiteString: { sn: string }; ->definiteString : Symbol(definiteString, Decl(objectSpread.ts, 63, 3)) ->sn : Symbol(sn, Decl(objectSpread.ts, 63, 21)) - -let optionalString: { sn?: string }; ->optionalString : Symbol(optionalString, Decl(objectSpread.ts, 64, 3)) ->sn : Symbol(sn, Decl(objectSpread.ts, 64, 21)) - -let optionalNumber: { sn?: number }; ->optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 65, 3)) +>definiteString : Symbol(definiteString, Decl(objectSpread.ts, 65, 3)) >sn : Symbol(sn, Decl(objectSpread.ts, 65, 21)) +let optionalString: { sn?: string }; +>optionalString : Symbol(optionalString, Decl(objectSpread.ts, 66, 3)) +>sn : Symbol(sn, Decl(objectSpread.ts, 66, 21)) + +let optionalNumber: { sn?: number }; +>optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 67, 3)) +>sn : Symbol(sn, Decl(objectSpread.ts, 67, 21)) + let optionalUnionStops: { sn: string | number | boolean } = { ...definiteBoolean, ...definiteString, ...optionalNumber }; ->optionalUnionStops : Symbol(optionalUnionStops, Decl(objectSpread.ts, 66, 3)) ->sn : Symbol(sn, Decl(objectSpread.ts, 66, 25)) +>optionalUnionStops : Symbol(optionalUnionStops, Decl(objectSpread.ts, 68, 3)) +>sn : Symbol(sn, Decl(objectSpread.ts, 68, 25)) let optionalUnionDuplicates: { sn: string | number } = { ...definiteBoolean, ...definiteString, ...optionalString, ...optionalNumber }; ->optionalUnionDuplicates : Symbol(optionalUnionDuplicates, Decl(objectSpread.ts, 67, 3)) ->sn : Symbol(sn, Decl(objectSpread.ts, 67, 30)) +>optionalUnionDuplicates : Symbol(optionalUnionDuplicates, Decl(objectSpread.ts, 69, 3)) +>sn : Symbol(sn, Decl(objectSpread.ts, 69, 30)) let allOptional: { sn?: string | number } = { ...optionalString, ...optionalNumber }; ->allOptional : Symbol(allOptional, Decl(objectSpread.ts, 68, 3)) ->sn : Symbol(sn, Decl(objectSpread.ts, 68, 18)) +>allOptional : Symbol(allOptional, Decl(objectSpread.ts, 70, 3)) +>sn : Symbol(sn, Decl(objectSpread.ts, 70, 18)) // computed property let computedFirst: { a: number, b: string, "before everything": number } = ->computedFirst : Symbol(computedFirst, Decl(objectSpread.ts, 71, 3)) ->a : Symbol(a, Decl(objectSpread.ts, 71, 20)) ->b : Symbol(b, Decl(objectSpread.ts, 71, 31)) +>computedFirst : Symbol(computedFirst, Decl(objectSpread.ts, 73, 3)) +>a : Symbol(a, Decl(objectSpread.ts, 73, 20)) +>b : Symbol(b, Decl(objectSpread.ts, 73, 31)) { ['before everything']: 12, ...o, b: 'yes' } ->'before everything' : Symbol(['before everything'], Decl(objectSpread.ts, 72, 5)) ->b : Symbol(b, Decl(objectSpread.ts, 72, 38)) +>'before everything' : Symbol(['before everything'], Decl(objectSpread.ts, 74, 5)) +>b : Symbol(b, Decl(objectSpread.ts, 74, 38)) let computedMiddle: { a: number, b: string, c: boolean, "in the middle": number } = ->computedMiddle : Symbol(computedMiddle, Decl(objectSpread.ts, 73, 3)) ->a : Symbol(a, Decl(objectSpread.ts, 73, 21)) ->b : Symbol(b, Decl(objectSpread.ts, 73, 32)) ->c : Symbol(c, Decl(objectSpread.ts, 73, 43)) +>computedMiddle : Symbol(computedMiddle, Decl(objectSpread.ts, 75, 3)) +>a : Symbol(a, Decl(objectSpread.ts, 75, 21)) +>b : Symbol(b, Decl(objectSpread.ts, 75, 32)) +>c : Symbol(c, Decl(objectSpread.ts, 75, 43)) { ...o, ['in the middle']: 13, b: 'maybe?', ...o2 } ->'in the middle' : Symbol(['in the middle'], Decl(objectSpread.ts, 74, 11)) ->b : Symbol(b, Decl(objectSpread.ts, 74, 34)) +>'in the middle' : Symbol(['in the middle'], Decl(objectSpread.ts, 76, 11)) +>b : Symbol(b, Decl(objectSpread.ts, 76, 34)) let computedAfter: { a: number, b: string, "at the end": number } = ->computedAfter : Symbol(computedAfter, Decl(objectSpread.ts, 75, 3)) ->a : Symbol(a, Decl(objectSpread.ts, 75, 20)) ->b : Symbol(b, Decl(objectSpread.ts, 75, 31)) +>computedAfter : Symbol(computedAfter, Decl(objectSpread.ts, 77, 3)) +>a : Symbol(a, Decl(objectSpread.ts, 77, 20)) +>b : Symbol(b, Decl(objectSpread.ts, 77, 31)) { ...o, b: 'yeah', ['at the end']: 14 } ->b : Symbol(b, Decl(objectSpread.ts, 76, 11)) ->'at the end' : Symbol(['at the end'], Decl(objectSpread.ts, 76, 22)) +>b : Symbol(b, Decl(objectSpread.ts, 78, 11)) +>'at the end' : Symbol(['at the end'], Decl(objectSpread.ts, 78, 22)) // shortcut syntax let a = 12; ->a : Symbol(a, Decl(objectSpread.ts, 78, 3)) +>a : Symbol(a, Decl(objectSpread.ts, 80, 3)) let shortCutted: { a: number, b: string } = { ...o, a } ->shortCutted : Symbol(shortCutted, Decl(objectSpread.ts, 79, 3)) ->a : Symbol(a, Decl(objectSpread.ts, 79, 18)) ->b : Symbol(b, Decl(objectSpread.ts, 79, 29)) ->a : Symbol(a, Decl(objectSpread.ts, 79, 51)) +>shortCutted : Symbol(shortCutted, Decl(objectSpread.ts, 81, 3)) +>a : Symbol(a, Decl(objectSpread.ts, 81, 18)) +>b : Symbol(b, Decl(objectSpread.ts, 81, 29)) +>a : Symbol(a, Decl(objectSpread.ts, 81, 51)) // generics function f(t: T, u: U): { id: string, ...T, ...U } { ->f : Symbol(f, Decl(objectSpread.ts, 79, 55)) ->T : Symbol(T, Decl(objectSpread.ts, 82, 11)) ->U : Symbol(U, Decl(objectSpread.ts, 82, 13)) ->t : Symbol(t, Decl(objectSpread.ts, 82, 17)) ->T : Symbol(T, Decl(objectSpread.ts, 82, 11)) ->u : Symbol(u, Decl(objectSpread.ts, 82, 22)) ->U : Symbol(U, Decl(objectSpread.ts, 82, 13)) ->id : Symbol(id, Decl(objectSpread.ts, 82, 31)) ->T : Symbol(T, Decl(objectSpread.ts, 82, 11)) ->U : Symbol(U, Decl(objectSpread.ts, 82, 13)) +>f : Symbol(f, Decl(objectSpread.ts, 81, 55)) +>T : Symbol(T, Decl(objectSpread.ts, 84, 11)) +>U : Symbol(U, Decl(objectSpread.ts, 84, 13)) +>t : Symbol(t, Decl(objectSpread.ts, 84, 17)) +>T : Symbol(T, Decl(objectSpread.ts, 84, 11)) +>u : Symbol(u, Decl(objectSpread.ts, 84, 22)) +>U : Symbol(U, Decl(objectSpread.ts, 84, 13)) +>id : Symbol(id, Decl(objectSpread.ts, 84, 31)) +>T : Symbol(T, Decl(objectSpread.ts, 84, 11)) +>U : Symbol(U, Decl(objectSpread.ts, 84, 13)) return { id: 'id', ...t, ...u }; ->id : Symbol(id, Decl(objectSpread.ts, 83, 12)) +>id : Symbol(id, Decl(objectSpread.ts, 85, 12)) } let exclusive: { id: string, a: number, b: string, c: string, d: boolean } = ->exclusive : Symbol(exclusive, Decl(objectSpread.ts, 85, 3)) ->id : Symbol(id, Decl(objectSpread.ts, 85, 16)) ->a : Symbol(a, Decl(objectSpread.ts, 85, 28)) ->b : Symbol(b, Decl(objectSpread.ts, 85, 39)) ->c : Symbol(c, Decl(objectSpread.ts, 85, 50)) ->d : Symbol(d, Decl(objectSpread.ts, 85, 61)) +>exclusive : Symbol(exclusive, Decl(objectSpread.ts, 87, 3)) +>id : Symbol(id, Decl(objectSpread.ts, 87, 16)) +>a : Symbol(a, Decl(objectSpread.ts, 87, 28)) +>b : Symbol(b, Decl(objectSpread.ts, 87, 39)) +>c : Symbol(c, Decl(objectSpread.ts, 87, 50)) +>d : Symbol(d, Decl(objectSpread.ts, 87, 61)) f({ a: 1, b: 'yes' }, { c: 'no', d: false }) ->f : Symbol(f, Decl(objectSpread.ts, 79, 55)) ->a : Symbol(a, Decl(objectSpread.ts, 86, 7)) ->b : Symbol(b, Decl(objectSpread.ts, 86, 13)) ->c : Symbol(c, Decl(objectSpread.ts, 86, 27)) ->d : Symbol(d, Decl(objectSpread.ts, 86, 36)) +>f : Symbol(f, Decl(objectSpread.ts, 81, 55)) +>a : Symbol(a, Decl(objectSpread.ts, 88, 7)) +>b : Symbol(b, Decl(objectSpread.ts, 88, 13)) +>c : Symbol(c, Decl(objectSpread.ts, 88, 27)) +>d : Symbol(d, Decl(objectSpread.ts, 88, 36)) let overlap: { id: string, a: number, b: string } = ->overlap : Symbol(overlap, Decl(objectSpread.ts, 87, 3)) ->id : Symbol(id, Decl(objectSpread.ts, 87, 14)) ->a : Symbol(a, Decl(objectSpread.ts, 87, 26)) ->b : Symbol(b, Decl(objectSpread.ts, 87, 37)) +>overlap : Symbol(overlap, Decl(objectSpread.ts, 89, 3)) +>id : Symbol(id, Decl(objectSpread.ts, 89, 14)) +>a : Symbol(a, Decl(objectSpread.ts, 89, 26)) +>b : Symbol(b, Decl(objectSpread.ts, 89, 37)) f({ a: 1 }, { a: 2, b: 'extra' }) ->f : Symbol(f, Decl(objectSpread.ts, 79, 55)) ->a : Symbol(a, Decl(objectSpread.ts, 88, 7)) ->a : Symbol(a, Decl(objectSpread.ts, 88, 17)) ->b : Symbol(b, Decl(objectSpread.ts, 88, 23)) - -let overlapConflict: { id:string, a: string } = ->overlapConflict : Symbol(overlapConflict, Decl(objectSpread.ts, 89, 3)) ->id : Symbol(id, Decl(objectSpread.ts, 89, 22)) ->a : Symbol(a, Decl(objectSpread.ts, 89, 33)) - - f({ a: 1 }, { a: 'mismatch' }) ->f : Symbol(f, Decl(objectSpread.ts, 79, 55)) +>f : Symbol(f, Decl(objectSpread.ts, 81, 55)) >a : Symbol(a, Decl(objectSpread.ts, 90, 7)) >a : Symbol(a, Decl(objectSpread.ts, 90, 17)) +>b : Symbol(b, Decl(objectSpread.ts, 90, 23)) + +let overlapConflict: { id:string, a: string } = +>overlapConflict : Symbol(overlapConflict, Decl(objectSpread.ts, 91, 3)) +>id : Symbol(id, Decl(objectSpread.ts, 91, 22)) +>a : Symbol(a, Decl(objectSpread.ts, 91, 33)) + + f({ a: 1 }, { a: 'mismatch' }) +>f : Symbol(f, Decl(objectSpread.ts, 81, 55)) +>a : Symbol(a, Decl(objectSpread.ts, 92, 7)) +>a : Symbol(a, Decl(objectSpread.ts, 92, 17)) let overwriteId: { id: boolean, a: number, c: number, d: string } = ->overwriteId : Symbol(overwriteId, Decl(objectSpread.ts, 91, 3)) ->id : Symbol(id, Decl(objectSpread.ts, 91, 18)) ->a : Symbol(a, Decl(objectSpread.ts, 91, 31)) ->c : Symbol(c, Decl(objectSpread.ts, 91, 42)) ->d : Symbol(d, Decl(objectSpread.ts, 91, 53)) +>overwriteId : Symbol(overwriteId, Decl(objectSpread.ts, 93, 3)) +>id : Symbol(id, Decl(objectSpread.ts, 93, 18)) +>a : Symbol(a, Decl(objectSpread.ts, 93, 31)) +>c : Symbol(c, Decl(objectSpread.ts, 93, 42)) +>d : Symbol(d, Decl(objectSpread.ts, 93, 53)) f({ a: 1, id: true }, { c: 1, d: 'no' }) ->f : Symbol(f, Decl(objectSpread.ts, 79, 55)) ->a : Symbol(a, Decl(objectSpread.ts, 92, 7)) ->id : Symbol(id, Decl(objectSpread.ts, 92, 13)) ->c : Symbol(c, Decl(objectSpread.ts, 92, 27)) ->d : Symbol(d, Decl(objectSpread.ts, 92, 33)) +>f : Symbol(f, Decl(objectSpread.ts, 81, 55)) +>a : Symbol(a, Decl(objectSpread.ts, 94, 7)) +>id : Symbol(id, Decl(objectSpread.ts, 94, 13)) +>c : Symbol(c, Decl(objectSpread.ts, 94, 27)) +>d : Symbol(d, Decl(objectSpread.ts, 94, 33)) class D { m() { }; q = 2; } ->D : Symbol(D, Decl(objectSpread.ts, 92, 44)) ->m : Symbol(D.m, Decl(objectSpread.ts, 94, 9)) ->q : Symbol(D.q, Decl(objectSpread.ts, 94, 18)) +>D : Symbol(D, Decl(objectSpread.ts, 94, 44)) +>m : Symbol(D.m, Decl(objectSpread.ts, 96, 9)) +>q : Symbol(D.q, Decl(objectSpread.ts, 96, 18)) let classesAreWrong: { id: string, ...C, ...D } = ->classesAreWrong : Symbol(classesAreWrong, Decl(objectSpread.ts, 95, 3)) ->id : Symbol(id, Decl(objectSpread.ts, 95, 22)) ->C : Symbol(C, Decl(objectSpread.ts, 42, 42)) ->D : Symbol(D, Decl(objectSpread.ts, 92, 44)) +>classesAreWrong : Symbol(classesAreWrong, Decl(objectSpread.ts, 97, 3)) +>id : Symbol(id, Decl(objectSpread.ts, 97, 22)) +>C : Symbol(C, Decl(objectSpread.ts, 44, 29)) +>D : Symbol(D, Decl(objectSpread.ts, 94, 44)) f(new C(), new D()) ->f : Symbol(f, Decl(objectSpread.ts, 79, 55)) ->C : Symbol(C, Decl(objectSpread.ts, 42, 42)) ->D : Symbol(D, Decl(objectSpread.ts, 92, 44)) +>f : Symbol(f, Decl(objectSpread.ts, 81, 55)) +>C : Symbol(C, Decl(objectSpread.ts, 44, 29)) +>D : Symbol(D, Decl(objectSpread.ts, 94, 44)) diff --git a/tests/baselines/reference/objectSpread.types b/tests/baselines/reference/objectSpread.types index 2b13af1d3d6..efab098fd6e 100644 --- a/tests/baselines/reference/objectSpread.types +++ b/tests/baselines/reference/objectSpread.types @@ -223,7 +223,7 @@ getter.a = 12; >a : number >12 : 12 -// null, undefined, functions and primitives result in { } +// null, undefined, functions and primitives besides string result in { } let spreadNull = { ...null }; >spreadNull : {} >{ ...null } : {} @@ -238,10 +238,6 @@ let spreadNum = { ...12 }; >spreadNum : {} >{ ...12 } : {} -let spreadStr = { ...'foo' }; ->spreadStr : {} ->{ ...'foo' } : {} - let spreadBool = { ...false }; >spreadBool : {} >{ ...false } : {} @@ -253,6 +249,11 @@ let spreadFunc = { ...(function () { }) }; >(function () { }) : () => void >function () { } : () => void +// strings get a numeric indexer: [n: number]: string +let spreadStr = { ...'foo' }; +>spreadStr : { [x: number]: string; } +>{ ...'foo' } : { [x: number]: string; } + // methods are not enumerable class C { p = 1; m() { } } >C : C diff --git a/tests/baselines/reference/objectSpreadNegative.errors.txt b/tests/baselines/reference/objectSpreadNegative.errors.txt index 84fb1cc4a76..b79354c4a94 100644 --- a/tests/baselines/reference/objectSpreadNegative.errors.txt +++ b/tests/baselines/reference/objectSpreadNegative.errors.txt @@ -11,8 +11,8 @@ tests/cases/conformance/types/spread/objectSpreadNegative.ts(30,12): error TS233 tests/cases/conformance/types/spread/objectSpreadNegative.ts(32,17): error TS2339: Property 'undefined' does not exist on type '{}'. tests/cases/conformance/types/spread/objectSpreadNegative.ts(36,11): error TS2339: Property 'toFixed' does not exist on type '{}'. tests/cases/conformance/types/spread/objectSpreadNegative.ts(38,11): error TS2339: Property 'toFixed' does not exist on type '{}'. -tests/cases/conformance/types/spread/objectSpreadNegative.ts(40,11): error TS2339: Property 'length' does not exist on type '{}'. -tests/cases/conformance/types/spread/objectSpreadNegative.ts(41,11): error TS2339: Property 'charAt' does not exist on type '{}'. +tests/cases/conformance/types/spread/objectSpreadNegative.ts(40,11): error TS2339: Property 'length' does not exist on type '{ [x: number]: string; }'. +tests/cases/conformance/types/spread/objectSpreadNegative.ts(41,11): error TS2339: Property 'charAt' does not exist on type '{ [x: number]: string; }'. tests/cases/conformance/types/spread/objectSpreadNegative.ts(45,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(49,12): error TS2339: Property 'b' does not exist on type '{}'. tests/cases/conformance/types/spread/objectSpreadNegative.ts(55,9): error TS2339: Property 'm' does not exist on type '{ p: number; }'. @@ -86,10 +86,10 @@ tests/cases/conformance/types/spread/objectSpreadNegative.ts(63,12): error TS232 let spreadStr = { ...'foo' }; spreadStr.length; // error, no 'length' ~~~~~~ -!!! error TS2339: Property 'length' does not exist on type '{}'. +!!! error TS2339: Property 'length' does not exist on type '{ [x: number]: string; }'. spreadStr.charAt(1); // error, no methods either ~~~~~~ -!!! error TS2339: Property 'charAt' does not exist on type '{}'. +!!! error TS2339: Property 'charAt' does not exist on type '{ [x: number]: string; }'. let spreadBool = { ...true }; spreadBool.valueOf(); // error, what were you thinking? let spreadFunc = { ...function () { } } diff --git a/tests/baselines/reference/variableDeclarationInStrictMode1.errors.txt b/tests/baselines/reference/variableDeclarationInStrictMode1.errors.txt index 9dd9a8d41a1..46782aaa1d6 100644 --- a/tests/baselines/reference/variableDeclarationInStrictMode1.errors.txt +++ b/tests/baselines/reference/variableDeclarationInStrictMode1.errors.txt @@ -1,4 +1,4 @@ -lib.d.ts(28,18): error TS2300: Duplicate identifier 'eval'. +lib.d.ts(32,18): error TS2300: Duplicate identifier 'eval'. tests/cases/compiler/variableDeclarationInStrictMode1.ts(2,5): error TS1100: Invalid use of 'eval' in strict mode. tests/cases/compiler/variableDeclarationInStrictMode1.ts(2,5): error TS2300: Duplicate identifier 'eval'. diff --git a/tests/cases/conformance/types/spread/objectSpread.ts b/tests/cases/conformance/types/spread/objectSpread.ts index e94775649e7..fc076e79543 100644 --- a/tests/cases/conformance/types/spread/objectSpread.ts +++ b/tests/cases/conformance/types/spread/objectSpread.ts @@ -35,14 +35,16 @@ let getter: { a: number, c: number } = { ...op, c: 7 } getter.a = 12; -// null, undefined, functions and primitives result in { } +// null, undefined, functions and primitives besides string result in { } let spreadNull = { ...null }; let spreadUndefind = { ...undefined }; let spreadNum = { ...12 }; -let spreadStr = { ...'foo' }; let spreadBool = { ...false }; let spreadFunc = { ...(function () { }) }; +// strings get a numeric indexer: [n: number]: string +let spreadStr = { ...'foo' }; + // methods are not enumerable class C { p = 1; m() { } } let c: C = new C()