こんにちは、ECF Techブログ
担当 Michiharu.Tです。
今回もTypeScriptについて、学習記録を兼ねてお伝えしていきたいと思います。
TypeScriptなだけあって、まずは型(Type)についてきちんと学ぼう!をテーマに、おおよそ次のキーワードについて書きたいと思います。
- interface
- function type
- optional
では早速行ってみましょう!
対象読者
- プログラミングの基本的な知識がある。
- JavaScriptについての基本的な知識がある。
また、今回の記事はTypeScriptの公式ページのハンドブックを参考に、独自の題材を使って説明しております。本家サイトについては、下記をご覧ください。
オプショナル型
TypeScriptでは、オプショナル型変数が使用できます。interfaceに利用する例を見てみましょう。
interfaceについては、本ブログのこちらこちらの記事をご覧ください。
interface Score{
japanese: number; //国語
math:number; //数学
english:number; //英語
science?:number; //理科
socialStudy?:number; //社会
}
上のプログラムのうちscience
とsocialStudy
プロパティについては、後ろに?
がついています。これがオプショナル型を示す記号です。
この例の場合、Score型となるオブジェクトはscience
とsocialStudy
のプロパティは、必須ではなくなります。
例を見てみましょう。上のScoreインタフェースが宣言されているものとします。
let taro : Score = {
japanese: 80,
math: 75,
english: 90
};
console.log(taro.math);
console.log(taro.science);
実行結果
75
undefined
変数taroはScore型として宣言しています。そのtaroに代入しているオブジェクトにはscience
とsocialStudy
プロパティはありませんが、代入ができていることがわかります。また、実際には存在しないプロパティを参照するとundefined
となっていることがわかります。
関数型
次にインタフェースに関数型(Function Type)を定義する例を見てみましょう。この例もScoreインタフェースが定義済みとします。
interface ScoreCalc{
( data: Score ) :void;
}
関数の型ということで、引数と戻り値だけが記述されます。( 引数名:型 ) : 戻り値型
の記述順です。
このインタフェースは次のように使用します。一旦、ここまでのすべてのプログラムを記述します。
interface Score{
japanese: number; //国
math:number; //数
english:number; //英
science?:number; //理
socialStudy?:number; //社
}
let taro : Score = {
japanese: 80,
math: 75,
english: 90
};
interface ScoreCalc{
( data: Score ) :void;
}
let calcMainSubject : ScoreCalc;
calcMainSubject = function( data: Score ){
let sum : number = data.japanese + data.math + data.english;
console.log("主要3教科の得点:" + sum);
};
calcMainSubject(taro);
実行結果
主要3教科の得点:245
国語・数学・英語の3科目が表示されました。calcMainSubject変数はScoreCalc型なので、ScoreCalcと同じ型の関数オブジェクトしか代入できません。
この使い方だと意義が薄いですが、TypeScriptを使ったライブラリだと、コールバック関数を関数型で指定するなどの例がみられます。
次に5科目の合計を表示するプログラムを作りましょう。先程のプログラムの続きとして、次を追加します。
let calcAllSubject : ScoreCalc = function( data: Score ){
if( data.science && data.socialStudy ){
//5科目の合計を計算
let sum : number = data.japanese + data.math + data.english
+ data.science + data.socialStudy;
console.log("5教科の得点:" + sum);
} else{
console.log("5科目の得点は計算できません");
}
};
5科目の計算です。今度は変数宣言と同時に関数を代入しています。
これにつぎを追加して、実行テストをします。
let hanako: Score = {
japanese : 90,
math : 85,
english : 80,
science : 75,
socialStudy : 90
};
calcAllSubject(taro);
calcAllSubject(hanako);
実行結果
5科目の得点は計算できません
5教科の得点:420
calcAllSubjectは5科目の合計を計算して表示します。taro
は5科目の値をすべて持っていないので、メッセージが表示されています。それに対してhanako
は5科目の値をすべて持っているので、計算結果が表示されています。
というわけで、ここまでのプログラムをすべて表示します。コメントを適宜入れていますのでご参考ください。
interface Score{
japanese: number; //国語
math:number; //数学
english:number; //英語
science?:number; //理科
socialStudy?:number; //社会
}
let taro : Score = { //理科と社会は必須ではないので、型はOK
japanese: 80,
math: 75,
english: 90
};
console.log(taro.math);
console.log(taro.science); //undefindとなります。
interface ScoreCalc{
( data: Score ) :void; //関数の型定義
}
let calcMainSubject : ScoreCalc;
calcMainSubject = function( data: Score ){
let sum : number = data.japanese + data.math + data.english;
console.log("主要3教科の得点:" + sum);
};
calcMainSubject(taro);
let calcAllSubject : ScoreCalc = function( data: Score ){
if( data.science && data.socialStudy ){
//5科目の合計を計算
let sum : number = data.japanese + data.math + data.english
+ data.science + data.socialStudy;
console.log("5教科の得点:" + sum);
} else{
console.log("5科目の得点は計算できません");
}
};
let hanako: Score = {
japanese : 90,
math : 85,
english : 80,
science : 75,
socialStudy : 90
};
calcAllSubject(taro); //5科目の合計が算出できないので、メッセージ
calcAllSubject(hanako); //5科目の合計が算出される
おわりに
本日はここまでとさせていただきます。ありがとうございました。インタフェースはプロパティも関数も記述しておくことができるので、クラスに適用することもできます。クラスに適用する場合は、Javaなどのオブジェクト指向言語にみられるインタフェースとほぼほぼ同じ役割を果たすことができます。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。