TypeScript 型推論編 ~JavaScriptらしさ~
型推論
変数には型を必ず付与する必要はない。
宣言時に代入された値から、型の推論ができる。
const/letの型推論
letの型推論
let test = 'aiu' //推論 let test: string
constの型推論
const test: 'aiu' //推論 const test: 'aiu'
Widening Literal Types
定数を変数に代入するとまた少し変わる。
const TestOne = 1 const TestTwo: 2 = 2 const TestThree = 3 as 3 let One = TestOne let Two = TestTwo let Three = TestThree const num = { //推論 One, // number Two, //2 Three //3 }
Array/Tupleの型推論
Arrayの型推論
const test = [ 0 , '1' ] //推論 const test: (string | number)[]
宣言時にアサーションas
を付与した場合。
const test = [0 as 0 ] //const test: (0)[] test.push(0) // OK test.push(1) //NG
const test = [true , 0] as [boolean , number] //index値参照 const t1 = test[1] // number
objectの型推論
object宣言時に初期値を与えることで型推論が適用。
const obj = { t1 : 1 t2 : '2' } //推論 const obj : { t1 : number, t2 : string } //再代入 obj[t1] = 3 //OK obj[t1] = '3' //NG
関数の戻り型推論
関数宣言の際に戻り型アノーテーションを必ず付与する必要はない。
function test(t1 : string){ console.log(t1) } //推論 function test(t1): void
Peomiseの型推論
Promiseは非同期処理を行う。 Promiseを返す関数
function test(t1: number){ return new Promise( resolve =>{ setTimeout(() => resolve(`${t1}ms passed`), t1) } ) } test(2000).then(res => {} ) //推論 function test(t1: number): Promise<{}>
時間経過後に文字列を持ってresolve
が実行される。
resolve
は非同期タスクが成功して完了した場合に実行される関数。
多くの場合then
を使って処理を後に託すがres
の型がstring型であることを特定できない。推論では上記のようになっている。
resolve関数の引数を指定する
function test(t1: number)Promise<string>{ return new Promise( resolve =>{ setTimeout(() => resolve(`${t1}ms passed`), t1) } ) } test(2000).then(res => {} ) // resはstring型 // new Promise<string>でもあり。
async関数
Promiseインスタンスを返す関数はasync
関数の中でawait
を実行することでも、型推論が行われる。
async function test(){ const t5 = await t1(1000) // t5: string return t5 } //推論 function test(): Promise<string>
async
関数の戻り型もPromise型。
Promise.all/Promise.race
Promise.all
/Promise.race
を使用すると、非同期処理を並行して実行する。
そしてそれぞれに応じた型推論の結果が適用される。
詳細は省きます。
import構文
import構文の型推論
外部モジュールで定義された変数や関数は、型付与の有無を問わず、そのまま型推論の対象となる。
ただこれはimport
に限られ、require
では型推論は行われない。
dynamic import
dynamic import
も型推論の対象となる。
dynamic import
は戻り値がPromiseのため、適切なコードを書けば型推論が適用される。
JSON
JSONファイルを外部モジュールとしてインポートして、定義内容を型推論できる。
設定が必要でtsconfig.json
のresolveJsonModule
とesModuleInterop
をtrue
に設定する。
TypeScript 基礎編 -後編- ~クラスから列挙まで~
キーワード
typeof
typeof
を使用して、宣言済みの変数の型を取得できる。
let asString: string = '' let test: typeof asString test = 'aiueo' //OK test = 0 //NG
keyof
keyof
でLiteral Unionなどのオブジェクトのプロパティ名称を取得できる。
typeof
との併用可能。
アサーション
アサーション(宣言)は値の型について把握している場合に使用。
ダウンキャスト可能な互換性のある場合に「この型である」と宣言する。
<>
とas
を使用する方法がある。
推奨はas
でアサーションを利用すると強力な型付けが可能になる。
let asString: any = 'String now'; let len: number = (<string>asString).length;
let asString: any = 'String now'; let len: number = (asString as string).lentgh;
クラス
宣言と継承
class Hoge{ ... constructor(aiueo: string, kakiku: string){ this.aiueo = aiueo this.kakiku = kakiku } } const hoge = new Hoge(kani , uni)
親クラスを継承したサブクラスで
super関数は親クラスのコンストラクタ実行に相当する。
クラスメンバ修飾子
public``protected``private
が付与できる。
他の言語と同様で
public
はどこでも。
protected
はサブクラスのみ。
private
は同一クラスのみ。
列挙型
列挙型はenum
を使用する。
数値列挙
初期化子を省ける。
enum Direction { aiu, // = 0 eo, // = 1 wa, // = 2 } const aiu = Direction.aiu
文字列挙
初期化しなければいけない。
enum Direcrtion{ aiu = "eo", wa = "on" }
open ended
列挙値の追加が可能。
enum Direction{ aiu = "eo" } enum Direction{ wa = "on" }
TypeScript 基礎編 -前編- ~JavaScriptの発展~
NaN
NaN(Not-a-Number)はJavaScriptでいう「非数」(数字ではない値のこと)。
const val = '100' const val = val + 200
以上のような型が違う場合でもJavaScriptが内部で数値として変換してしまっていた。
このように型の不整合やバグを防ぐために登場TypeScript!
TypeScript基本の型!
boolean
値はTrue
orFalse
number
浮動小数点値(数値)
string
テキストデータ
array
配列となっていて[]
で表す。
tuple
固定数の要素がわかっている配列。
any
型の不明な場合に使用し、型のチェックを無効にする。
unknown
anyに近く型安全なany。
void
型がまったくないこと。
基本的には返り値なしで使用。
null/undefined
すべての型のサブタイプ。
単体ではあまり役に立たない。
never
発生し得ない値の型。
object
非プリミティブ型
boolean``number``string
などのいずれでもない。
型レベルアップ
Intersection Types
複数の肩を1つに結合する。
既存の型をまとめて単一の型を取得できる。
&
(アンパサンド)で連結する。
Union Types
複数の型のうちのいずれか1つの型を成立することを示す。
|
(パイプ)で連結する。
Literal Types
文字列に必要な型を指定できる。
let test: 'aiueo' test = 'aiueo' //OK test = 'kakikukeko' //NG
Numeric Literal Types
数値として必要な型を指定できる。
Boolean Literal Types
審議値として必要な型を指定できる。
TypeScript 入門編 ~より高度に~
TypeScriptとは
JavaScriptの進化版!
Microsoftによって開発され、コンパイルするとJavaScriptに変換される。
インストール
事前にNode.jsのインストールが必要。
npm install -g typescript
typescriptをインストールするとtsc
コマンド使える。
tsc --init
ファイル
ファイルの拡張子はts
になる。
tsc
コマンドを実行するとTypeScriptファイルがJavaScriptにビルドされる。
tsc
Vue SPA Vuex編 -第2章- ~Vuexの完全理解!~
ストアの分割
ストアはモジュール化し、分割することで管理しやすくする。
モジュールの使い方
オブジェクトで定義したモジュールを、ストアのmodules
オプションに登録する。
モジュール定義
const moduleA = { } const moduleB = { }
ストアに登録
const store = new Vuex.Store({ modules:{ moduleA, moduleB } })
モジュールのステートアクセス
store.state.moduleA store.state.moduleB
ネームスペース
同一のタイプをコミットする際に同期させたくない場合に別のタイプ名を使用する。
その際にモジュールを定義する際、namespaced
オプションをtrue
に設定して
ネームスペースを持つことが可能になる。
ネームスペースがついた場合/
で区切って呼び出す。
commit('<ネームスペース>/<タイプ>')
機能とオプション
ストアの状態を監視
Vuexでアプリケーションレベルのウォッチャを定義できる。
関数の第1引数にstate
、第2引数にgetters
を使用して監視するデータを返す。
Strictモード
strict : true
でコードを厳格にみる。
Vuexでホットリロード
APIメソッドstore.hotUpdate()
の設定が必要になる。
ただしVuex.Store
コンストラクタを使用するファイルは
ホットリロードが使用できないため
、別ファイルで作成する必要がある。
Vue SPA Vuex編 -第1章- ~VuexはDB!~
Vuex
状態管理の拡張ライブラリで、データとその状態に関する全てを一元管理する。
特徴
Vuexによって管理されているデータはリアクティブになっているため、
構造状態に関わらず常に同期されている。
またデータの管理や、状態を管理できるモジュール機能などを持つ。
ポリフィル
ES2015のPromise
に対応していないブラウザをサポートする為に
babel-polyfill
などのポリフィルをインストールする必要がある。
import 'babel-polyfill' import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex)
Store
Vuexで状態を管理する為ストアを作成する。
アプリケーション内の仮想的なデータベースと考える。
Vuex.Store
コンストラクタでインスタンスを作成する。
Vueアプリケーションにストアを登録する
ストアのインスタンスをVueアプリケーションのルートに登録すれば、
コンポーネントのインスタンスプロパティ$store
でどこからでも使用できる。
そして単一ファイルコンポーネントごとにstoreを読み込む必要がなくなる。
コアコンセプト
コンポーネントとVuexの機能の繋がり
コンポーネント ↓ アクション(store内) ←→ 外部API ↓ ミューテーション(store内) ↓ ステート(store内) ↓ コンポーネント ↓
と繰り返している流れ。
ステート(state)
ステートはストアで管理している状態そのもの。
ミューテーション以外からの変更はできない。
コンポーネントでいうdata
。
ゲッター(getter)
ゲッターは、ステートを取得する為の算出データ。
算出プロパティとの違いは引数が渡せるが、セッターはない。
プロパティやメソッドを受け取れる。
コンポーネントでいうcomputed
とmethods
の中間。
ただ引数付きのゲッターはキャッシュが行われないので、
何度かアクセスするデータはコンポーネントの算出プロパティに登録してキャッシュするのが良い。
ミューテーション(mutations)
ステートを変更できる唯一のメソッド。
コンポーネントでいうmethods
。
ミューテーションとアクションのメソッドはタイプと呼ばれる。
引数で以下の情報が受け取れる。
1.state ステート
2.payload コミットからの引数
コミット(commit)
ミューテーションを呼び出すためのインスタンスメソッドがコミット。
コンポーネントでいう$emit
。
引数の使用可。
アクション(action)
非同期処理を含めることができるメソッドで、
データの処理や非同期処理を行い、結果をミューテーションへコミットする。
ステートを変更する以外の処理はアクション内で済ませるのが良い。
ディスパッチ(dispatch)
登録されているアクションを呼び出すインスタンスメソッドで、
別のアクション内からも使用できる。
ミューテーションとpayload
の扱いは同じ。
Vuexの小さなまとめ
1.アプリケーションレベルの状態まではストアで管理する。
2.ミューテーション内でしか状態変更ができない。
3.非同期処理はコミット前!
次回!
これ以上管理しやすく!?Vuexのさらなる知識!