* Remove the narrow-to-fresh rule added with boolean literals
* Revert "Remove the narrow-to-fresh rule added with boolean literals"
This reverts commit 9f96fe5da3
.
* Only apply freshness to booleans for now
* Add largeish example from issue
* Should be AND not OR
* Add minor improvements suggested by @ahejelsberg
* Reorder conditional a bit
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']];
|
|
} |