コンテンツにスキップ

[TypeScript] 2.4

TypeScript2.4のリリース内容まとめ

Dynamic Import Expressions

HAD BETTER EASY

動的なモジュールインポートがサポートされた。
await import("...")構文を使うと、その行が実行されたタイミングでインポートされる。

たとえば、以下のような./util.tsがあったとき..

export function sum(x: number, y: number): number {
    return x + y
}

静的importと動的importではそれぞれ以下の書き方になる。

import {sum} from "./util"

function main() {
    console.log(sum(1, 2))
}

main()
async function main() {
    const {sum} = await import("./util")
    console.log(sum(1, 2))
}

main()

bundlerを使う場合、動的importの範囲ごとに出力バンドルを自動分割してくれる。
フロントエンド開発でパフォーマンスを考える場合は有効かも。

String Enums

HAD BETTER EASY

String Enumに対応した.

enum Node {
    station = "駅"
    busstop = "バス停"
}

Improved inference for generics

NOT NECESSARY CAN NOT UNDERSTAND

ジェネリクスの推論が改善した。
古いバージョンであり、対応前後の差分を知るメリットも無いため詳細は原文を参照。

Strict contravariance for callback parameters

NOT NECESSARY CAN NOT UNDERSTAND

ジェネリクスパラメータがコールバック型のとき、現在の関係を考慮した反変制約に従ってチェックするようになった。

checked in a contravariant manner with respect to the current relation とは???

上記が正確には何を意味しているのか理解できていない。。
コードは以下の挙動になるが、反変ではなく共変のように見える。。理解できていない..

interface Mappable<T> {
    map<U>(f: (x: T) => U): Mappable<U>;
}


// --- Union types ---

declare let numberMappable: Mappable<number>;
declare let mappable: Mappable<string | number>;

// エラーが出るようになった
numberMappable = mappable;
// OK
mappable = numberMappable;

// ---


// --- Paren & Child ---
interface Animal {
    name: string
}

interface Cat extends Animal {
    cry(): string
}

declare let animalMappable: Mappable<Animal>;
declare let catMappable: Mappable<Cat>;

// エラーが出るようになった
catMappable = animalMappable
// OK
animalMappable = catMappable

// ---

Weak Type Detection

NOT NECESSARY EASY

Weak Typeの検出ができるようになった。

すべてのプロパティがOptionalである場合、そのインタフェースはWeak Type。

// SpotはWeak Type
interface Spot {
    name?: string,
    isOpen?: boolean,
}

すべてがOptionalであるため、一度型のない変数を経由したObjectを、別の型と勘違いして使っても気づけない。
このミスを防ぐため、すべてOptionalプロパティであっても最低1つは存在することを確認するようになった。

// SpotはWeak Type
interface Spot {
    name?: string,
    isOpen?: boolean,
}

function doSomething(spot: Spot) {
    // DO Something
}

// 型シグニチャのない変数に一度代入する
const empty = {}
const knownAndUnknown = {name: "hoge", unknown: "unknown"}
const onlyUnknown = {unknown: "unknown"}

// 以前もv2.4以降もOK
doSomething(empty)  // 空の場合は間違えるリスクが低いため問題ない
doSomething(knownAndUnknown)

// 以前はOK. v2.4からエラー
doSomething(onlyUnknown)