網站搜尋

我該如何告訴 TypeScript 一個函數會修改它父作用域中的值?


所以在某些情況下,TypeScript 會在 if 語句內自動縮小一個值的類型範圍。這非常有用。然而,我經常遇到的問題是,如果調用了一個修改該值的函數,它不會重新擴寬類型範圍。

這裡是一個簡化的問題範例:

function example() {
    let val = "foo";
    function modifyVal() {
        val = "bar";
    }
    if(val == "foo") {
        //typescript knows that val must be the unit type "foo"
        modifyVal(); //this changes it's value 
        //typescript still thinks that val == "foo" and thinks it
        //shouldn't be comparable to "bar"  
        if(val == "bar") {

        }
    }
}

有沒有什麼簡單的方法來停用這個功能?或者讓編譯器識別 val 被修改。目前每次遇到這種情況,我都使用 val as T。

我正在使用版本 2.7.0-dev.20171104。然而,這個行為在線上 Playground https://www.typescriptlang.org/play/ 也會出現。

編輯: 我剛剛檢查過,這也存在於修改其狀態的類和函數中。