【TypeScript】型の定義について基礎をまとめました【12種類の型を紹介!】
2023年1月26日
この記事では、TypeScriptの型についてまとめてみました。
TypeScriptは型が付いたJavaScriptを拡張した言語です。
TypeScriptはコンパイラしたときにJavaScriptに変換されます。
プログラミングにおいて型の恩恵は大きく、型を定義することで、予期せぬエラーを未然に防ぐことができます。
この記事が少しでも参考になれば幸いです。
前提知識
①TypeScriptでは型の定義を小文字で定義します。
Stringではなくstringなので注意しましょう。
②JavaScriptに備わっているデータ型はTypeScriptでサポートされています。
- number
- string
- boolean
- object
- Array
上記以外にも以下の型がサポートされています。
- Tuple
- Enum
- any
- Union
- Literal
- 型エイリアス カスタム型
- unkown
- void
- function
- never
引数の型 基本的な使い方
①TypeScriptでは型の定義を引数で使用します。
function calc(n1:number, n2:number){
return n1 + n2;
}
// 引数n1,n2はnumber型で定義されています
// number以外の型が渡るとエラーになります
注意が必要なのは、TypeScriptの定義と異なる型が渡っても、コンパイラは通常どおり実行されることです。
TypeScriptはあくまでコードの動作は変えずに、誤ったコードのチェックを行う言語です。
ブラウザでエラーチェックをする必要が無く、誤ったコードに素早く気づくことができます。
②変数や定数には基本的に型を定義しません。
TypeScriptには型推論という機能があります。
型推論でTypeScriptが自動で型を判別してくれます。
型推論が行われる場合は、型を定義しないことがベストプラクティスです。
【例外】
変数や定数の定義時に値を代入しない場合は、型を定義するべきです。
let num = 1;
let num2:number ;
//numの場合は、自動的にnumber型と判断されます
//num2の場合は、any型となり型推論が行われません
object型
objectは型推論が行われますが、明示的に定義することもできます。
const person:{
name:string;
age:number;
} = {
name:"shun",
age:20,
}
const person:{
name:string;
age:20;
} = {
name:"shun",
age:20,
}
//型の定義では数字そのものを定義することもできます。
//上記のコードでは20以外の数字がオブジェクトで定義されるとエラーになります。
Array型
配列型で複数の変数を格納できるデータ型です。
異なったデータ型と併せて使用することができます。
let sports : string[];
const person:{
name:string;
hobbies:string[];
} = {
name:"shun",
hobbies:["study","sports"]
}
//配列の型定義はstring[]のように記述します
Tuple型
要素の数を固定し、なおかつ要素の型を指定します。
const person:{
name:string;
role:[number,string];
} = {
name:"shun",
role:[10,"admin"],
}
//roleがTuple型となります
//上記のように指定することで、要素の数と型を定義することができます
注意点として、Tuple型では異なる型の値の代入は防げますが、pushメソッドでの代入は防ぐことはできません。
person.role[1] = 100;
//配列のインデックス1にはstringが定義されているのでエラーとなる
person.role = [0 , "member" , 20]
//roleには2つの要素しか定義されていないのでエラーとなる
person.role.push("abcd")
//pushメソッドでの代入は防ぐことができない、エラーとはならない
Enum型
ある定数の集合体に対して、番号を付けて管理します。
自動的に数値が割り当てられ、かつ直感的に分かりやすいコードを記述することができます。
列挙型とも呼ばれます。
enum Hobbies{
baseball,
baske,
soccer,
}
//baseballには0、baskeには1、soccerには3が自動的に割り当てられます
enum Hobbies{
baseball = "me",
baske = 100,
soccer = 200,
}
//baseballのように数値だけではなく文字列も割り当てることができます
//何も指定しない場合、0から自動的に割り当てられますが、baskeやsoccerのように好きな数字を割り当てることもできます
enum Hobbies{
baseball = 10,
baske,
soccer,
}
//上記のように指定すると、baskeには11、soccerには12が割り当てられます
以下のように使用します。
const person= {
hobbies : Hobbies.baske
}
複数の定数が必要になった場合にEnum型を使うと便利です。
any型
any型にはどんな値でも入れることができます。
バニラJavaScriptと同じように、型を定義しないということになります。
Union型
引数の受け取る型を柔軟にする場合などに使用します。
型の定義を柔軟にすることができます。
function calc(a : number | string , b:number){
return a + b ;
}
//引数aはstringかnumberを受け取ることができます
Literal型
値そのものを厳密に定義するときに使用します。
numberやstringといった型の定義は行いません。
const num = 50 ;
//numはnumber型ではなく、50として定義されます。
//numは50以外の数値はありえないからです。
function call(a : "person" | "dog" ){
return a ;
}
//引数aには文字列personか文字列dogしか渡すことができません
型エイリアス カスタム型
何度も同じ型を書くのを防ぎ、同じ型の定義を何度も使いまわすことができます。
typeというキーワードを使用します。
type combinable = number | string ;
function combine( a:combinable , b :combinable){
return a + b ;
}
//引数aとbにはtypeで指定した型が定義されます。
type Obj = "person" | "dog" ;
function call(a : Obj ){
return a ;
}
//Literal型も定義することができます
型エイリアスを使用することでコードの再利用性が向上します。
また、型の定義を1か所で管理することも可能になります。
unkown型
unkown型で定義した変数に変数を代入する場合は、型のチェックを行う必要があります。
any型と似ていますが、unknow型は型のチェックをする必要があります。
どんな型になるか分からない場合に、使用します。
let input : unknown;
let username : string;
input = 20 ;
input = "tarou" ;
username = input
//変数の代入は、型のチェックを行っていないためエラーとなります
if(typeof input ==="string"){
username = input
}
//変数の代入は、型のチェックを行っているためエラーとはなりません
戻り値の型 基本的な使い方
関数では引数の他に、戻り値の型を定義することができます。
変数と同じように、型推論で戻り値が推測される場合は、型定義を行わないことがベストプラクティスです。
void型
void型は関数がreturn命令を持たないということを示します。
function calc(n1:number, n2:number){
return n1 + n2;
}
function print(n3:number){
console.log(n3);
}
print(calc(10,20));
//関数printはcalcの実行結果をconsoleに出力するだけの関数となっています
//このようにreturn命令を持たない関数はvoid型が割り当てられます
function型
any型に対して関数を定義する、特定の関数を型として定義する場合に使用します。
関数がどの引数を受け取り、どの型を返り値として返すか明確に定義できます。
function calc(n1:number, n2:number){
return n1 + n2;
}
let calcdainyu : ( a:number, b:number) => number ;
calcdainyu = 5;
//定義した関数の引数と返り値をとらないのでエラーとなります
calcdainyuu = calc ;
//定義した関数の引数と返り値をとるので正常に機能します
どこかの関数を呼び出す関数を格納する場合に使用できます。
never型
voidと同じく何も返さない時に指定する型です。
neverは絶対にありえないという意味です。
voidと違う点は、値を絶対に戻り値を返さない関数に対して明示的に指定します。
neverを記述することで、他の開発者のコード可読性が向上します。
最後に
TypeScriptの型について基礎を解説しました。
TypeScriptの型を使うことで、エラーを未然に防ぐことができます。
JavaScriptには存在しない概念なので、苦戦するところではありますがきっちり抑えておきましょう。
最後まで読んでいただきありがとうございました。