swc/crates/swc_ecma_parser/tests/tsc/noUncheckedIndexedAccessDestructuring.ts

76 lines
1.9 KiB
TypeScript

// @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
}
{
const { x, ...q } = numMapPoint;
x.
toFixed(); // Should OK
q.
y.toFixed(); // Should OK
q.
z.toFixed(); // Should error
}
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
}