[TypeScript] 2.3¶
TypeScript2.3のリリース内容まとめ
Generators and Iteration for ES5/ES3¶
HAD BETTER EASY
--downlevelIteration
フラグを付けることで、targetがES5/ES3でもジェネレータとイテレータをサポートするようになった。
--downlevelIteration | target=ES3 | target=ES5 | target=ES2015以降 |
---|---|---|---|
あり | O | O | O |
なし | X | X | O |
もちろんtsconfig.json
の指定でOK。
{
"compilerOptions": {
"target": "es5",
"downlevelIteration": true
}
}
function* gener() {
yield 1
yield 2
}
// downlevelIterationがfalse かつ targetがES2015より前だとここでエラーになる
for (const v of gener()) {
console.log(v)
}
Async Iteration¶
SHOULD NORMAL
Iterator
とGenerator
のAsyncバージョンとして、AsyncIterator
とAsyncGenerator
が追加された。
項目 | 主な利用シーン (他にもあるはず) |
---|---|
AsyncIterator | next やreturn 、throw の実装でawait を使いたいとき |
AsyncGenerator | generator functionの実装でawait を使いたいとき |
AsyncIterator
とAsyncGenerator
を使うには、for
の代わりfor await
を使う。
const lazyGet = (response: string, delaySec: number): Promise<string> =>
new Promise((resolve) => setTimeout(() => resolve(response), delaySec * 1000))
interface ApiResponse {
res1: string
res2: string
}
async function* gener(): AsyncGenerator<ApiResponse> {
yield {
res1: await lazyGet("res1", 0.5),
res2: await lazyGet("res2", 1),
}
yield {
res1: await lazyGet("res100", 3),
res2: await lazyGet("res200", 0.01),
}
}
async function main() {
console.log("Begin")
// async function* のreturn型 AsyncGenerator<...> は 普通のfor文では回せない
for await (const v of gener()) {
console.log(v)
}
console.log("End")
}
main()
// Begin
// ... 1秒待ち (2並列で遅い方を待つ)
// { res1: 'res1', res2: 'res2' }
// ... 3秒待ち (2並列で遅い方を待つ)
// { res1: 'res100', res2: 'res200' }
// End
targetがES5以前の場合
--downlevelIteration
が必要なので注意。
Generic parameter defaults¶
HAD BETTER EASY
ジェネリクスパラメータにデフォルト値を設定できるようになった。
高頻度で同じ型を指定する場合はスッキリ書ける。
// ID, Nameはほとんどの場合はstringなのでデフォルト指定
interface Spot<ID = string, Name = string> {
id: ID
name: Name
}
// デフォルトであればジェネリクスパラメータの指定不要!
const stringIdSpot: Spot = {
id: "1-1",
name: "spot1"
}
// IDをnumberにしたいときは、第1パラメータだけ指定
const numericIdSpot: Spot<number> = {
id: 1,
name: "spot1"
}
// Nameをanyにしたいときは第2パラメータまで指定
const anyNameSpot: Spot<string, any> = {
id: "unknown",
name: {
"1F": "ビル1階",
"2F": "ビル2階",
},
}
New --strict master option¶
HAD BETTER EASY
--strict
オプションが追加された。
tsc --init
で生成されるtsconfig.json
にもデフォルトでstrict: true
となる。
--strict
オプションが有効だと、現時点では以下すべてが有効と等価。
個々のオプションを追加で指定すると、上書きもできる。
--strictNullChecks
--noImplicitAny
--noImplicitThis
--alwaysStrict
オプションの種類やデフォルト値はTypeScriptのバージョンアップによって、より望ましい形に変わる。
--strict
オプションを有効にしておけば、変更点を追従しなくても安心の設定を維持できる。
Enhanced --init output¶
NOT NECESSARY EASY
tsc --init
で作成されるtsconfig.json
に、共通compiler
オプションと説明コメントが含まれるようになった。
有効にしたいオプションがあれば、アンコメントアウトするだけで使える。
Errors in .js files with --checkJs¶
HAD BETTER EASY
オプションに--checkJs
が追加された。
--allowJs
が有効の場合、JavaScriptのエラーはスルーされていた。
だが、--checkJs
も有効にすることでエラーを拾うことができる。
以下のmain.ts
をビルドすると、--checkJs
でエラーの有無が変わる。
import {sum} from "./util"
console.log(sum(1, 2))
/**
*
* @param x {number}
* @param y {number}
* @returns {number}
*/
export function sum(x, y) {
// 戻り値がnumberではないので本来NG
return String(x + y)
}
@ts-nocheck
や@ts-ignore
アノテーションを使うと、特定箇所だけチェックしたりその逆も可能。