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
に設定する。