型別保護功能

你可以使用你想要的任何邏輯宣告用作型別保護的函式。

他們採取以下形式:

function functionName(variableName: any): variableName is DesiredType {
    // body that returns boolean
}

如果函式返回 true,則 TypeScript 會在呼叫函式的任何塊中將型別縮小為 DesiredType

例如( 試一試 ):

function isString(test: any): test is string {
    return typeof test === "string";
}

function example(foo: any) {
    if (isString(foo)) {
        // foo is type as a string in this block
        console.log("it's a string: " + foo);
    } else {
        // foo is type any in this block
        console.log("don't know what this is! [" + foo + "]");
    }
}

example("hello world");          // prints "it's a string: hello world"
example({ something: "else" });  // prints "don't know what this is! [[object Object]]"

保護的函式型別謂詞(函式返回型別位置中的 foo is Bar)在編譯時用於縮小型別,函式體在執行時使用。型別謂詞和函式必須一致,否則你的程式碼將無效。

型別保護功能不必使用 typeofinstanceof,它們可以使用更復雜的邏輯。

例如,此程式碼通過檢查它的版本字串來確定你是否有 jQuery 物件。

function isJQuery(foo): foo is JQuery {
    // test for jQuery's version string
    return foo.jquery !== undefined;
}

function example(foo) {
    if (isJQuery(foo)) {
        // foo is typed JQuery here
        foo.eq(0);
    }
}