Nullable Types
JavaScriptでは、存在しない値を宣言する方法が2つあります。
TypeScriptでは、optionalやnullableな値を宣言する
方法をさらにいくつか提供します。
最初に、JavaScriptの基本型である
undefinedとnullの違いを見てみましょう。
Undefinedは値が見つからないときあるいは設定できない場合です。
// Nullは値が意図的に欠如していることを
意味します。
const emptyObj = {};
const anUndefinedProperty: undefined = emptyObj["anything"];
// なぜundefinedを使わないのでしょう?
主な理由としては、textが正しく含まれていることを確認できるからです。
もしtextがundefinedの場合、
結果はtextが存在しないときと同じものになります。
これは、少し表面的に感じるかもしれません。
しかし、JSON文字列に変換したときに、
textがundefinedの場合、textは変換された文字列に含まれません。
Strict Null Types
TypeScript 2.0より前では、undefinedとnullは事実上、型システムから無視されていました。
これによって、TypeScriptのコーディング環境は
型のないJavaScriptに近づいてしまっていました。
バージョン2.0にて、"strictNullChecks"というコンパイラフラグが追加されました。
このフラグをオンにすると、undefinedとnullが
コードフロー分析を通して対応すべき型として扱われるようになります。
(より詳細には example:code-flow を参照ください)
TypeScriptでstrict null checksを有効にしたときの違いの例として
以下の"Potential String"型をホバーしてみてください:
const searchResults = {
video: { name: "LEGO Movie" },
text: null,
audio: { name: "LEGO Movie Soundtrack" },
};
// PotentialString型ではundefinedとnullが切り捨てられています。
もし、設定に行きstrictモードを有効にして戻ってくると、
PotentialString型がすべての型の交差型になっていることが
確認できます。
type PotentialString = string | undefined | null;
// 型アサーションや非nullアサーション演算子(!)を使うなど
TypeScriptに詳細を教える方法はいくつかあります。
declare function getID(): PotentialString;
const userID = getID();
console.log("User Logged in: ", userID.toUpperCase());
// strictモードでは、上記はエラーになります。
// voidは値を返さない関数の
戻り値型です。
const definitelyString1 = getID() as string;
const definitelyString2 = getID()!;
// あるいはifを用いて存在を安全に確認することもできます:
if (userID) {
console.log(userID);
}
// Optional Properties
// Void
// 実行時にはundefinedであっても、
TypeScriptはコンパイルエラーを発生させるために
void型を保持します。
const voidFunction = () => {};
const resultOfVoidFunction = voidFunction();