Preserved Narrowing in Closures Following Last Assignments

TL;DR

Nallowingされた型がクロージャ内の処理にも伝搬するようになった。

Example

以下の例で、クロージャ内の url はURL型と認識される。

function getUrls(url: string | URL, names: string[]) {
    if (typeof url === "string") {
        url = new URL(url);
    }
    return names.map(name => {
        // url: URL
        url.searchParams.set("name", name);
    });
}

ただしクロージャで変更された値が別のクロージャで参照される場合、Nallowingは伝搬されない。

function printValueLater(value: string | undefined) {
    // value: string
    if (value === undefined) {
        value = "missing!";
    }
    
    // クロージャ1 value: string
    setTimeout(() => {
        value = value;
    }, 500);
    
    // クロージャ2 value: string | undefined
    setTimeout(() => {
        console.log(value.toUpperCase()); // ERROR
    }, 1000);
}

Last updated