TS是很好的輔助工具,但有時候過於嚴格的輔助了....當你發現你比TS更知道目前是什麼情況,就是斷言派上用場的時機,但斷言同時也屏蔽了編譯器對代碼的檢查,需要謹慎使用!
一般斷言
- 尖括號语法: 在需要斷言的變數前加上 `<Type>` 即可
*當使用 JSX 會造成衝突,建議使用aslet foo: any;
let bar = <string>foo; // 现在 bar 的类型是 ‘string’`
- as语法let someValue: any = “this is a string”;
let strLength: number = (someValue as string).length;
雙重斷言: 當使用類型斷言仍報錯
function handler(event: Event) {
const element = event as HTMLElement; // Error: 因為HTMLElement 不是 Event 的子类
}
先斷言成兼容所有類型的 any
function handler(event: Event) {
const element = (event as any) as HTMLElement; // ok
}
非空斷言
x!
⇒ 排除 null 和 undefined 的狀況
function handler (arg: string | null | undefined) {
let str: string = arg!;
str.split('');
}
確定賦值斷言
//例 1
let x: number;
initialize();
console.log(x); // 編譯器報錯
//例 2
let y!: number; // 在變量 y 聲明後添加驚嘆號,告訴編譯器之後會賦值,避免報錯
initialize();
console.log(y);
參考文章:
https://jkchao.github.io/typescript-book-chinese/typings/typeAssertion.html#双重断言