TypeScript Null & Undefined
TypeScript 擁有強大的系統來處理 null
或 undefined
值。
預設情況下,null
和 undefined
的處理是停用的,可以透過將 strictNullChecks
設定為 true 來啟用。
此頁面的其餘部分適用於啟用了 strictNullChecks
的情況。
型別
null
和 undefined
是原始型別,可以像其他型別(如 string
)一樣使用。
當啟用了 strictNullChecks
時,TypeScript 要求為變數賦值,除非在型別中明確添加了 undefined
。
可選鏈 (Optional Chaining)
可選鏈是一個 JavaScript 功能,它與 TypeScript 的 null 處理配合得很好。它允許使用緊湊的語法訪問可能存在也可能不存在的物件屬性。在訪問屬性時,可以使用 ?.
運算子。
示例
interface House {
sqft: number;
yard?: {
sqft: number;
};
}
function printYardSize(house: House) {
const yardSize = house.yard?.sqft;
if (yardSize === undefined) {
console.log('No yard');
} else {
console.log(`Yard is ${yardSize} sqft`);
}
}
let home: House = {
sqft: 500
};
printYardSize(home); // Prints 'No yard'
自己動手試一試 »
空值合併 (Nullish Coalescence)
空值合併是另一個 JavaScript 功能,它也與 TypeScript 的 null 處理配合得很好。它允許編寫專門處理 null
或 undefined
的回退表示式。當表示式中可能出現其他虛值但仍有效時,這很有用。它可以在表示式中使用 ??
運算子,類似於使用 &&
運算子。
示例
function printMileage(mileage: number | null | undefined) {
console.log(`Mileage: ${mileage ?? 'Not Available'}`);
}
printMileage(null); // Prints 'Mileage: Not Available'
printMileage(0); // Prints 'Mileage: 0'
自己動手試一試 »
Null 斷言 (Null Assertion)
TypeScript 的型別推斷系統並非完美,有時忽略值可能是 null
或 undefined
的可能性是有意義的。一種簡單的方法是使用型別斷言,但 TypeScript 也提供 !
運算子作為便捷的快捷方式。
示例
function getValue(): string | undefined {
return 'hello';
}
let value = getValue();
console.log('value length: ' + value!.length);
自己動手試一試 »
與型別斷言一樣,這可能不安全,應謹慎使用。
陣列邊界處理
即使啟用了 strictNullChecks
,預設情況下 TypeScript 也會假設陣列訪問永遠不會返回 undefined(除非 undefined 是陣列型別的一部分)。
可以使用 noUncheckedIndexedAccess
配置來更改此行為。
示例
let array: number[] = [1, 2, 3];
let value = array[0]; // 使用 `noUncheckedIndexedAccess` 時,此型別為 `number | undefined`
自己動手試一試 »