型別保護功能
你可以使用你想要的任何邏輯宣告用作型別保護的函式。
他們採取以下形式:
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
)在編譯時用於縮小型別,函式體在執行時使用。型別謂詞和函式必須一致,否則你的程式碼將無效。
型別保護功能不必使用 typeof
或 instanceof
,它們可以使用更復雜的邏輯。
例如,此程式碼通過檢查它的版本字串來確定你是否有 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);
}
}