### 例外処理
try, catch(e), finallyで書く
以下のスクリプトでは
const f = (arr?:any[]): void => { let res = 'Array: ' for(let i of arr){ res += String(i) + '\t' } console.log(res) } try { f(['ok', 'NG']) f([10, 20, 30]) f() } catch(e){ console.log(e.message) }
“arr is not iterable”
### 例外を発生させる関数
const f = (n:number):[number, Error?] => { if (n < 0){ return [n, Error("negative number")] } let total = 0 for(let i = 1; i<= n; i++) total += i return [total] } let[res1, err1] = f(100) if(err1 == undefined) console.log(res1) else console.log(err1) let[res2, err2] = f(-100) if(err2 == undefined) console.log(res2) else console.log(err2)
### Errorをthrowする
throw Error
const f = (n:number):number => { if (n < 0){ throw Error("negative!") } let total = 0 for(let i = 1; i<= n; i++) total += i return total } let re1 = f(100) console.log(re1) let re2 = f(-100) console.log(re2)
### ジェネリクス
定義の段階では型を指定せず、利用する場合に特定の型を使う
function 関数
function getRnd<T>(values: T[ ]): T { const r = Math.floor(Math.random() * values.length) return values[r] } const data1 = [0, 2, 4, 5, 6, 10] const data2 = ['グー','チョキ','パー'] const data3 = [true, false] for(let i = 0; i < 10; i++){ const re1 = getRnd(data1) const re2 = getRnd(data2) const re3 = getRnd(data3) const res = re1 + '(' + typeof(re1) + ')\t' + re2 + '(' + typeof(re2) + ')\t' + re3 + '(' + typeof(re3) + ')' console.log(res) }
### ジェネレーターと遅延評価
呼び出すごとに新しい値を取り出す関数
function* と yield(待ち状態)を作ります
nextで次の数字を呼び出す
function* fibo(n:number){ let n1 = 0 let n2 = 1 for(let i = 0; i <= n; i++){ yield n1 let n3 = n1 + n2 n1 = n2 n2 = n3 } } const n = 10 let fb = fibo(n) for(let i = 0; i <= n + 3; i++){ let ob = fb.next() console.log(ob.value) }
### 非同期処理とpromise
処理を開始すると、待ち続けることなく次の処理に進んでいく
promiseは事後処理を呼び出して必要な作業を行う
function 関数(引数): Promise { return new Promise ((関数) => { 関数() }) }
const f = (n:number, d:number): Promise<number> => { console.log("start:" + n) return new Promise((f) => { let total = 0 for(let i = 1; i <= n; i++) total += i setTimeout(() => { f(total) }, d) }) } const cb = (n:number) => { console.log("result:" + n) } f(10, 300).then(cb) f(100, 200).then(cb) f(1000, 100).then(cb)
プロミスを理解しないといけないことはわかった