2021-01-15 13:30:44 +03:00
|
|
|
// @strict: true
|
|
|
|
// @noUncheckedIndexedAccess: true
|
|
|
|
|
|
|
|
declare const strArray: string[];
|
|
|
|
declare const strStrTuple: [string, string];
|
|
|
|
|
|
|
|
// Declaration forms for array destructuring
|
|
|
|
|
|
|
|
// Destructuring from a simple array -> include undefined
|
|
|
|
const [s1] = strArray;
|
|
|
|
s1.toString(); // Should error, s1 possibly undefined
|
|
|
|
|
|
|
|
// Destructuring a rest element -> do not include undefined
|
|
|
|
const [...s2] = strArray;
|
|
|
|
s2.push(undefined); // Should error, 'undefined' not part of s2's element type
|
|
|
|
|
|
|
|
// Destructuring a rest element -> do not include undefined
|
|
|
|
const [, , ...s3] = strArray;
|
|
|
|
s3.push(undefined); // Should error, 'undefined' not part of s2's element type
|
|
|
|
|
|
|
|
// Declaration forms for object destructuring
|
|
|
|
|
|
|
|
declare const strMap: { [s: string]: string };
|
|
|
|
|
|
|
|
const { t1 } = strMap;
|
|
|
|
t1.toString(); // Should error, t1 possibly undefined
|
|
|
|
|
|
|
|
const { ...t2 } = strMap;
|
|
|
|
t2.z.toString(); // Should error
|
|
|
|
|
|
|
|
// Test intersections with declared properties
|
|
|
|
declare const numMapPoint: { x: number, y: number} & { [s: string]: number };
|
|
|
|
{
|
|
|
|
const { x, y, z } = numMapPoint;
|
|
|
|
x.toFixed(); // Should OK
|
|
|
|
y.toFixed(); // Should OK
|
|
|
|
z.toFixed(); // Should error
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
const { x, ...q } = numMapPoint;
|
|
|
|
x.toFixed(); // Should OK
|
|
|
|
q.y.toFixed(); // Should OK
|
|
|
|
q.z.toFixed(); // Should error
|
|
|
|
}
|
|
|
|
|
2023-02-23 10:55:58 +03:00
|
|
|
{
|
|
|
|
const { x, ...q } = numMapPoint;
|
|
|
|
x.
|
|
|
|
toFixed(); // Should OK
|
|
|
|
|
|
|
|
q.
|
|
|
|
y.toFixed(); // Should OK
|
|
|
|
|
|
|
|
q.
|
|
|
|
z.toFixed(); // Should error
|
|
|
|
}
|
|
|
|
|
2021-01-15 13:30:44 +03:00
|
|
|
|
|
|
|
declare let target_string: string;
|
|
|
|
declare let target_string_undef: string | undefined;
|
|
|
|
declare let target_string_arr: string[];
|
|
|
|
|
|
|
|
// Assignment forms
|
|
|
|
[target_string] = strArray; // Should error
|
|
|
|
[target_string_undef] = strArray; // Should OK
|
|
|
|
[,,, ...target_string_arr] = strArray; // Should OK
|
|
|
|
|
|
|
|
{
|
|
|
|
let x: number, y: number, z: number | undefined;
|
|
|
|
({ x, y, z } = numMapPoint); // Should OK
|
|
|
|
|
|
|
|
let q: number;
|
|
|
|
({ q } = numMapPoint); // Should error
|
|
|
|
}
|