はじめに
TypeScriptの学習で学んだことについて後日自分で振り返るためにまとめていきます。
TypeScript 学習記録
の続きです。
オブジェクト
オブジェクトリテラル記法
オブジェクトリテラル記法を用いてオブジェクトを定義する。
プロパティ
?(オプショナル)がついたものは、値があってもなくても良い。
readonlyがついたプロパティは最初だけ値を定義することができ、後から書き換えられない。
//オブジェクトリテラル記法
let human: {
name: string
age: number
readOnly bloodype :string
gender? :string
} = {
name: 'tarou',
age: 20,
bloodype: 'A'
}
//以下はただのオブジェクトで、プロパティが認識されない
// const human:object = {
// name: "tarou"
// age: 20
// }
// human.name //エラー
インデックスシグネチャ
オブジェクトがあるプロパティを何度も使用する時に使う。
keyはstringまたはnumber
const sample1: {
[position: string]: string
} = {
'leader': 'Taro',
'deputyLeader': 'Hanako'
}
sample1.member = 'Sho'
型エイリアス 型定義の再利用
型に名前をつけて宣言、再利用することができる
type Membership = {
name: string
number: number
gender: string
}
const member: Membership = {
name : 'Taro',
number:1,
gender:'man'
}
合併型(union)と交差型(intersection)
合併型はオブジェクトAまたはBのどちらかになれる
交差型はオブジェクトAとBの要素をすべて必ずもつ
type union = A | B
type intersection = A & B
配列とタプル
### 配列
合併型もできるけど、あまり使わない
TypeScriptは型推論もしてくれる
const member: string[] = ['Taro', 'Hanako']
const sample: (string | number)[] = ['あいうえお', 123]
タプル
配列よりも厳格な型定義
レストパラメータも使える
const member: [number, string] = [1, 'Taro']
イミュータブル(読み取り不可)の配列
配列はconstで宣言されても書き換え可能(ミュータブル)
イミュータブルにするために、readonlyをつける
const sample: readonly string[] = ['abc', 'あいう', 'efg']
//sample.push("かきく") エラーになる
//sample.[0] = 'hij' エラーになる
ジェネリック型
型の種類は違うが同じデータ構造のものを共通化する。
オブジェクト指向の多態性に該当する。
type SampleGeneric<T> = {
(array: T[], value: T): T
}
const SampleFunc: SampleGeneric<string> = (array, value) => {
return 'sample';
}
// 完全な呼び出しシグネチャ(
type SampleGeneric2 = {
<T>(array: T[], value: T): T
<U>(array: U[], value: U): U
}
// 呼び出しシグネチャの省略記法
type SampleGeneric3<T> = (array: T[], value: T) => T
type SampleGeneric4 = <T>(array: T[], value: T) => T
オブジェクト指向
・継承(インヘリタンス)
・カプセル化
・多態性(ポリモーフィズム)
クラスをまとめて、隠して、クラスを元にインスタンスをたくさん作ってく。
クラスがたこ焼き機で、インスタンスがたこ焼き。
○オブジェクト指向で用いる用語
・プロパティ
・メソッド
・コンストラクタ
・インスタンス
private…そのクラスのみでアクセス可能、インスタンスでも使える
protected…そのクラスとサブクラスのみ
public…デフォルト、どこからでもアクセス可能
抽象クラス…abstractがついたクラス、インスタンス化できず継承して用いるクラス
//クラス定義
class Sample {
private name:string
private num:number
constructor(name: string, num: number) {
this.name = name
this.num = num
}
}
//インスタンス化
new Sample('Taro',1)
abstract class SampleAbs {} //抽象クラス
class SampleAbs1 extends SampleAbs{} //抽象クラスの継承