// @target: es2015 var o = { a: 1, b: 'no' } var { ...clone } = o; var { a, ...justB } = o; var { a, b: renamed, ...empty } = o; var { ['b']: renamed, ...justA } = o; var { 'b': renamed, ...justA } = o; var { b: { '0': n, '1': oooo }, ...justA } = o; let o2 = { c: 'terrible idea?', d: 'yes' }; var { d: renamed, ...d } = o2; let nestedrest: { x: number, n1: { y: number, n2: { z: number, n3: { n4: number } } }, rest: number, restrest: number }; var { x, n1: { y, n2: { z, n3: { ...nr } } }, ...restrest } = nestedrest; let complex: { x: { ka, ki }, y: number }; var { x: { ka, ...nested }, y: other, ...rest } = complex; ({x: { ka, ...nested }, y: other, ...rest} = complex); var { x, ...fresh } = { x: 1, y: 2 }; ({ x, ...fresh } = { x: 1, y: 2 }); class Removable { private x: number; protected y: number; set z(value: number) { } get both(): number { return 12 } set both(value: number) { } m() { } removed: string; remainder: string; } interface I { m(): void; removed: string; remainder: string; } var removable = new Removable(); var { removed, ...removableRest } = removable; var i: I = removable; var { removed, ...removableRest2 } = i; let computed = 'b'; let computed2 = 'a'; var { [computed]: stillNotGreat, [computed2]: soSo, ...o } = o; ({ [computed]: stillNotGreat, [computed2]: soSo, ...o } = o); var noContextualType = ({ aNumber = 12, ...notEmptyObject }) => aNumber + notEmptyObject.anythingGoes;