オプショナルと Readonly プロパティ
CoddyのJavaScriptジャーニー「Introduction To TypeScript」セクションの一部。レッスン 41/73。
TypeScriptは、この制御を可能にする2つの強力な修飾子を提供します。それは、オプションプロパティ修飾子とreadonly修飾子です。
? 記号はプロパティを任意(オプショナル)にします。つまり、オブジェクトを作成する際にそのプロパティが存在しなくてもよいという意味です。これは、常に必要とは限らないプロパティに便利です:
interface User {
name: string;
email?: string; // 任意のプロパティ
}
let user1: User = { name: "Alice" }; // 有効 - emailは任意です
let user2: User = { name: "Bob", email: "bob@example.com" }; // これも有効ですreadonly修飾子は、オブジェクトの作成後にプロパティが変更されるのを防ぎます。これは、一意の識別子のように、一定に保つべきプロパティに最適です:
interface Product {
readonly id: number; // 作成後は変更できません
name: string;
}
let product: Product = { id: 1, name: "Laptop" };
product.name = "Gaming Laptop"; // 有効
// product.id = 2; // エラー: 'id'は読み取り専用であるため、代入できません同じインターフェース上で両方の修飾子を組み合わせることができ、これらの修飾子はインターフェースと型エイリアスの両方で同様に機能するため、オブジェクト構造を正確に制御できるようになります。
チャレンジ
簡単以下のプロパティを持つ Book という名前のインターフェースを作成してください:
title:型はstring(必須)isbn:型はstring(読み取り専用readonly)subtitle:型はstring(任意optional)pages:型はnumber(必須)publishedYear:型はnumber(読み取り専用readonly)genre:型はstring(任意optional)
以下のプロパティを持つ Magazine という名前のインターフェースを作成してください:
name:型はstring(必須)issueNumber:型はnumber(読み取り専用readonly)topic:型はstring(任意optional)monthlySubscription:型はboolean(必須)
作成したインターフェースを使用して、以下の変数を作成してください:
novelという名前のBook型の変数を作成し、title に"1984"、isbn に"978-0-452-28423-4"、pages に328、publishedYear に1949を設定します。cookbookという名前のBook型の変数を作成し、title に"The Joy of Cooking"、isbn に"978-0-7432-4626-2"、subtitle に"All About Baking"、pages に1132、publishedYear に2006、genre に"Cooking"を設定します。techMagという名前のMagazine型の変数を作成し、name に"Tech Today"、issueNumber に45、monthlySubscription にtrueを設定します。scienceMagという名前のMagazine型の変数を作成し、name に"Science Weekly"、issueNumber に12、topic に"Climate Change"、monthlySubscription にfalseを設定します。
Book 型のパラメータを受け取り、string を返す getBookDetails という名前の関数を作成してください。この関数は、本のタイトルとページ数を "[title] - [pages] pages" の形式で返す必要があります。
Magazine 型のパラメータを受け取り、string を返す getMagazineInfo という名前の関数を作成してください。この関数は、雑誌の名前と号数を "[name] Issue #[issueNumber]" の形式で返す必要があります。
以下の出力を別々の行に表示してください:
novelを引数にしてgetBookDetailsを呼び出し、その結果を表示するcookbookを引数にしてgetBookDetailsを呼び出し、その結果を表示するtechMagを引数にしてgetMagazineInfoを呼び出し、その結果を表示するscienceMagを引数にしてgetMagazineInfoを呼び出し、その結果を表示するnovelの ISBN を表示するtechMagの購読状況(monthlySubscriptionプロパティ)を表示する
自分で試してみよう
// TODO: ここにコードを書いてください
// Bookインターフェースを作成します
// Magazineインターフェースを作成します
// インターフェースを使用して変数を作成します
// getBookDetails関数を作成します
// getMagazineInfo関数を作成します
// 必要な出力を表示しますこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Introduction To TypeScriptのすべてのレッスン
2基本の型
基本の型: str, num, boolean'any' 型: 脱出ハッチ'unknown' 型'null' と 'undef' の扱い型推論の実践明示的な型アノテーションまとめ:基本の型の演習5型:エイリアス、ユニオン型、インターセクション型
プリミティブ型の型エイリアスユニオン型 ('|')ユニオン型の扱い方リテラル型インターセクション型 ('&')型エイリアスの組み合わせまとめ:高度な型の組み合わせ3データ構造:配列とタプル
型付き配列配列の 'readonly' 修飾子タプルとは?タプルの宣言とアクセスタプルの分割代入Readonly タプル多次元の型付き配列配列でのスプレッド演算子まとめ:配列とタプル6オブジェクトとインターフェースの型定義
インラインでのオブジェクト型アノテーションオブジェクトの型エイリアスインターフェース入門インターフェース vs 型エイリアスオプショナルと Readonly プロパティインターフェースと型の拡張インターフェースへのメソッドの追加まとめ:オブジェクトの構造定義自分で練習してみよう: JavaScriptオンラインコンパイラ