61 lines
1.3 KiB
TypeScript
61 lines
1.3 KiB
TypeScript
|
function f1() {
|
||
|
let b = true;
|
||
|
let obj = { b };
|
||
|
// Desired: OK
|
||
|
// 3.0: OK
|
||
|
// 3.1 as-is: OK
|
||
|
// 3.1 minus widening propagation: error
|
||
|
obj.b = false;
|
||
|
}
|
||
|
|
||
|
function f2() {
|
||
|
type Element = (string | false);
|
||
|
type ElementOrArray = Element | Element[];
|
||
|
let el: Element = null as any;
|
||
|
let arr: Element[] = null as any;
|
||
|
let elOrA: ElementOrArray = null as any;
|
||
|
|
||
|
// Desired/actual: All OK
|
||
|
let a1: ElementOrArray = el;
|
||
|
let a2: ElementOrArray = arr;
|
||
|
let a3: ElementOrArray = [el];
|
||
|
let a4: ElementOrArray = Array.isArray(elOrA) ? elOrA : [elOrA];
|
||
|
|
||
|
// Desired: OK
|
||
|
// 3.0: Error
|
||
|
// 3.1: OK
|
||
|
let a5: ElementOrArray = [...Array.isArray(elOrA) ? elOrA : [elOrA]];
|
||
|
}
|
||
|
|
||
|
function f3() {
|
||
|
type XY = 'x' | 'y';
|
||
|
const x: XY = 'x';
|
||
|
let x2 = x;
|
||
|
// Desired: OK (up for debate?)
|
||
|
// 3.0: Error
|
||
|
// 3.1 as-is: OK
|
||
|
x2 = 'y';
|
||
|
|
||
|
// Desired/actual: All OK
|
||
|
let x3: XY = x;
|
||
|
x3 = 'y';
|
||
|
}
|
||
|
|
||
|
function f4() {
|
||
|
const x: boolean = true;
|
||
|
let x1 = x;
|
||
|
// Desired: OK
|
||
|
// 3.0: OK
|
||
|
// 3.1: OK
|
||
|
// 3.1 minus widening propagation: error
|
||
|
x1 = false;
|
||
|
}
|
||
|
|
||
|
function f5() {
|
||
|
type XY = 'x' | 'y';
|
||
|
let arr: XY[] = ['x'];
|
||
|
arr = ['y'];
|
||
|
// Desired: OK
|
||
|
// Error in all extant branches
|
||
|
arr = [...['y']];
|
||
|
}
|