🕋
TypeScript再入門
作成日: 2024-07-14T15:32:00.000Z
最終更新: 2024-08-07T12:24:00.000Z
-
型アノテーション
// :string ← これ // 明示的に型をつけること const name: string = '名前' // 補足 // アノテーションとは // 注釈、データにタグをつけるなど、意味を持たせるということ
-
プリミティブ型
- プログラミング言語などが仕様として提供する基本的なデータ型(number, string, nullなど)
- プリミティブ = 原始的なもの、原型、根源的な
-
呼び出しシグネチャ
- シグネチャ = 署名
// 省略記法 type LogMessage = (message: string) => void // 完全記法 type FullLogMessage = { (message: string): void } // messageはstring、返り値はvoidとなる const logMessage: LogMessage = (message) => { console.log(message) }
-
オブジェクトリテラル記法
let country = { language: string name: string } = { language: 'Japanese', name: 'JAPAN' }
-
インデックスシグネチャ
- オブジェクトの動的なプロパティの型定義を可能にする特殊な構文要素
[key名: string]: 型名
- 動的にどんな値がくるか予測できないような、キーが事前に定義できないオブジェクトの型を定義する場合に役立つ
type ItemsType = { [key: string]: string; }; const items: ItemsType = { desk: "wooden", phone: "plastic", glasses: "metal", bag: "leather", };
-
型エイリアス
- typeを使って、型に名前をつけて宣言すること
type Country = { capital: string language: string name: string }
-
厳格な配列 タプル
// numberとstringの順に2要素で並ぶ配列という型指定 const array: [number, string] = [123, "array"] // 可変長(レストパラメータ)も使用可能 const numbers: [string, ...number[]] = ["123", 123]
-
immutableな配列
// JavaScriptの配列はconstで宣言してもミュータブル(書き換え可能) const mutableNumbers: number[] = [1,2,3] mutableNumbers[2] = 4 // [1,2,4] // readonlyでイミュータブル(書き換え不可)な配列/タプルを作れる const immutableNumbers: readonly number[] = [1,2,3] immutableNumbers[2] = 4 // error: 型 'readonly number[]' のインデックス シグネチャは、読み取りのみを許可します。 // 他の書き方 const immutableNumbers2: ReadonlyArray<number> = [1,2,3] const immutableNumbers3: Readonly<number[]> = [1,2,3]
-
ジェネリック
// ジェネリック型 型の抽象化 type Generic<T> = (args: T) => T // Genericという同じ型を汎用的に利用可能 const function01: Generic<number> = (num) => { return num } // numberしか渡せない function01(123) const function02: Generic<string> = (string) => { return string } // stringしか渡せない function02("123")
- 応用
// 2つの抽象的な型指定 type Generic<T, U> = (args: T) => U const function01: Generic<number, string> = (num) => { return `${num}` } function01(123)
-
typeとinterfaceについて
-
宣言方法
-
interface
- 型の宣言
interface Human { name: string age: number }
-
type(型エイリアス)
- 型の代入(=で代入する、セミコロンが最後につく)
type Human = { name: string age: number };
-
-
型の結合
-
interface
-
再宣言することでプロパティが追加される
interface Human { name: string age: number } interface Human { blood: 'A' | 'B' | 'O' | 'AB' } const Taro: Human = { name: '太郎', age: 20, blood: 'A' }
-
-
type
-
交差型(union)を利用
type NameAndAge = { name: string age: number } type BloodType = { blood: 'A' | 'B' | 'O' | 'AB' } type Human = NameAndAge & BloodType const Taro: Human = { name: '太郎', age: 20, blood: 'A' }
-
-
-
拡張
- interface
-
extendsする
interface Book { title: string } interface Magazine extends Book { cycle: 'daily' | 'weekly' } const jump: Magazine = { title: '週刊少年ジャンプ', cycle: 'weekly' }
-
型エイリアスを拡張することも可能
// 型エイリアスのBookに変更 type Book = { title: string } interface Magazine extends Book { cycle: 'daily' | 'weekly' } const jump: Magazine = { title: '週刊少年ジャンプ', cycle: 'weekly' }
-
- interface
-
classに型定義する
-
implements
interface Book { page: number title: string Log(): void; } class Comic implements Book { page; // numberと認識される title; // stringと認識される constructor(page: number, title: string) { this.page = page this.title = title } // voidと認識される Log() { console.log(`${this.title}のページ数は${this.page}です`) } } const popularComic = new Comic(200, "鬼滅の刃") popularComic.Log();
-
-
まとめ
Type Alias Interface 用途 複数の場所で再利用する 型に名前をつけるため オブジェクト・クラス・関数の構造を定義するため 拡張性 同盟のtypeを宣言するとエラー 同盟のinterfaceを宣言するとマージされる 継承 継承はできない 交差型で新しい型エイリアスを作る extendsによる継承ができる 使用できる型 オブジェクトや関数以外のプリミティブ、配列、タプルも宣言可能 オブジェクトと関数の方のみ宣言できる 考慮事項 拡張しにくい不便さがある 意図しない拡張によるバグが生まれる可能性 いつ使う アプリ開発ではType Alias ライブラリ開発ではInterface
-
-
番外編
- class
-
抽象クラス(abstract)
-
インスタンス化できないクラス
-
継承でサブクラスを作るためのクラス
abstract class AbstractClassSample {}
-
- class