コンテンツにスキップ

[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

IteratorGeneratorのAsyncバージョンとして、AsyncIteratorAsyncGeneratorが追加された。

項目 主な利用シーン (他にもあるはず)
AsyncIterator nextreturnthrowの実装でawaitを使いたいとき
AsyncGenerator generator functionの実装でawaitを使いたいとき

AsyncIteratorAsyncGeneratorを使うには、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アノテーションを使うと、特定箇所だけチェックしたりその逆も可能。