当サイトは、アフィリエイト広告を利用しています
TypeScriptの型定義方法として
TypeAnnotation(型アノテーション)があり
でそれぞれどう使うのかをサンプルを作りながらまとめる。
型を宣言する時に「:」を使ってその右側に型を宣言することを
と呼ぶ。
※型注釈と呼ぶ時もあります。
型アノテーションで変数を宣言するサンプル
一番よく使う基本の型で
JavaScriptのプリミティブの型と対応している
//stringlet moji:string = '文字列'//数値let kazu:number = 111//booleanlet bool:boolean = true
リテラル型には
がある。
型アノテーションでリテラル型を使うと、そのプリミティブ型の特定の値のみしか
設定できなくなる。
//リテラル型_stringlet retStr:"takeshi" = 'takeshi'//okretStr:"takeshi" = 'yoshio'//error//リテラル型_numberlet retNum:0 = 0//okretNum:0 = 1//error//リテラル型_booleanlet retBool:false = false//okretBool:false = true//error
用途としてはユニオン型 (union type)と組み合わせて
ステータス管理などに使用される
//ステータス管理let status:'開始'|'処理中'|'終了' = '開始'status = '処理中'status = '終了'
型アノテーションで関数を宣言するサンプル 関数の型定義では
をする。
ちょっとわかりづらいので構文先に書くと
下記のようになる。
const func:(引数の型アノテーション)=>戻り値の型アノテーション = 関数
実際の関数に当てはまめると下記のようになる。
//関数の型アノテーション//戻り値なしconst func:(val:string)=> void = (foo)=>{console.log(foo);}func("hoge")// 実行結果// hoge//戻り値ありconst func2:(num1:number,num2:number)=>number = (num1,num2)=>{return num1 + num2}console.log(func2(1,2));// console.log(func2(1)); //error// console.log(func2(1,'3')); //error// 実行結果// 3//引数部分のみ型アノテーションconst func3 = (val:string)=>{console.log(val);}func("hoge")// 実行結果// hoge
型アノテーションでオブジェクトを宣言するサンプル。
基本は下記の形になる
let obj: {id: string,name:string,phoneNumber:number} = {id: '1',name:'yoshio',phoneNumber:111111}
基本は型アノテーションでオブジェクトを宣言した場合、
代入するオブジェクトは宣言したアノテーションの
を満たしている必要があり、満たしていないとコンパイルエラーとなる。
//コンパイルエラーとなるlet obj: {id: string,name:string,phoneNumber:number} = {id: '1',name:'yoshio',}
例えば上記は型アノテーション宣言時に「phoneNumber」を
設定しているため、設定するオブジェクトに「phoneNumber」が
ないとコンパイルエラーとなる
とはいえそれだと、プロパティの省略や追加ができないので
したい場合は下記のようにする
プロパティの右側に「?」をつけることが
そのプロパティを省略可能にできる
let obj: {id: string,name:string,phoneNumber?:number} = {id: '1',name:'yoshio',}
インデックスシグネチャを使うことでプロパティ追加可能な型アノテーションを
宣言できる。
let obj: { id:string[key:string]: string;} = {id: '01',name: 'masao'};console.log(JSON.stringify(obj,null,3));// 実行結果// {// "id": "01",// "name": "masao"// }
インデックスシグネチャは
にする必要があり、満たさないとコンパイルエラーとなる
プロパティにreadonlyをつけることで
そのプロパティを読み取り専用にできる
let obj: {readonly id:stringreadonly [key:string]: string;} = {id: '1',name: 'masao'};obj.id = '02'//errorobj.name = 'toshio'//error
型アノテーションで配列を宣言するサンプル。
書き方は2種類があるがどっちでもいい。
let array1: number[];array1 = [1, 2, 3];//ジェネリクスを使うlet array2: Array<stirng>;array2 = ['a', 'b', 'c'];
個人的にはジェネリクスのほうを書くことが多い気がします。
オブジェクトや配列を分割代入する場合も型アノテーションをつけることができる。
構文は下記のようになる。
const {分割代入するプロパティ}:{型アノテーション} = 分割代入元オブジェクト
実装してみる
//オブジェクト作成const user:{id: number;name: string;age: number;}={id:1,name:'hoge',age:21}//分割代入の型アノテーションconst {id,name}:{id:number,name:string} = userconsole.log(id);console.log(name);
注意点としてはオブジェクトで?をつけて省略可能にしてる
プロパティを分割代入しようとした場合、
分割代入の型アノテーションでも?をつけないとコンパイルエラーとなる
//オブジェクト作成const user:{id: number;name: string;age?: number;}={id:1,name:'hoge',age:21}//分割代入の型アノテーション// const {id,name,age}:{id:number,name:string,age:number} = user//errorconst {id,name,age}:{id:number,name:string,age?:number} = user//okconsole.log(id);console.log(name);console.log(age);
propsで分割代入を使う場合の型アノテーションは
下記のような感じ
/** @jsxImportSource @emotion/react */import { StrStyle } from "./emotionCss";//オブジェクト定義type personalData = {name: string;age: string;address: string;};//propsの定義type propsType = {data: personalData;};//分割代入するconst Person: (props: propsType) => JSX.Element = ({data: { name, age, address }}: propsType) => {return (<><h1>{name}</h1><h1>{age}</h1><h1>{address}</h1></>);};export function App() {let pdata: personalData = {name: "takashi",age: "11",address: "tokyo"};return (<div css={[StrStyle]}><Person data={pdata} /></div>);}
TypeScriptの分割代入について下記記事でも紹介しています
型アノテーションは宣言するもの(変数や関数、オブジェクト)によって
書き型が若干ちがったりして混乱するので、サンプルを作ってまとめてみた。
Typesciptを使っている時はいいのだが、使わなくなると多分、忘れてるので。。。