2018-11-04
以前『速習Vue.js』でVue.jsをおさらいしたが、その時に同じシリーズのTypeScriptの本も見かけたのであわせて読んでみた。
速習TypeScript: altJSのデファクトスタンダートを素早く学ぶ! 速習シリーズ | 山田祥寛
本著の構成は以下の通り。
TypeScriptとは何か?というところから始まり、実行環境や基本的な構文、クラスと継承などオブジェクト指向の構文についてコンパクトにまとめられている。
他の速習シリーズと同様に、素早く全体像を把握したり、高速に振り返りをするといった目的に最適な本だと感じた。
let name: string = "John Smith"
変数名の後にコロンを挟み、型を定義する。
配列の場合
let nums: number[] = [1, 2, 3, 4, 5]
上記の型の他に TypeScript には連想配列・列挙型・タプル型などがある。
複数の型を持つ場合。
let data = string | number;
簡単に型に別名をつけることができる。しかし、後述のインターフェイスでできることに型エイリアスを使うべきではない。
type typeAlias = string | number
let data: typeAlias
変数やリテラルの前に<型の名前>
をつけることで型の変換ができる
もしくはas
使う
const greet = function(name: string): string {
return `Hello, ${name}!`
}
アロー関数を使う場合は以下の通り。
const greet = (name: string): => `Hello, ${name}!`
引数の後ろに?
をつける。
const greet = (name: string?): => {
if (name === undefined) {
return `Hello, World!`
}
return `Hello, ${name}!`
}
abstract class Greeting {
constructor(private name: string) {}
abstract greet(): string;
}
class JapaneseGreeting extends Greeting {
greet(): string {
return `こんにちは、${this.name}。`
}
}
TypeScriptの継承は同時に1つまでしかできないが、インターフェイスは複数を同時に実装することができる。
interface Greet {
greet(): string;
}
class JapaneseGreeting implements Greet {
constructor(private name: string) {}
greet(): string {
return `こんにちは、${this.name}。`
}
}
明示的にクラスの継承/インターフェイスの実装を行なっていなくても、クラス/インターフェイスの構造と合致していれば互換性のある型としてみなされる。対になる言葉は「公称的部分型」
ジェネリックを使うことで、汎用的なメソッドやクラスに特定の型を指定することができる。
let data: Array<number> = [0, 1, 2, 3]
(ただし配列に関してはnumber[]
とすることで簡単に宣言できる)
この2つは基本オンで。