コンテンツにスキップ

[TypeScript] 2.6

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

Strict function types

HAD BETTER HARD

--strictFunctionTypesフラグが追加された。
--strictが有効ならデフォルトで有効になる。

このフラグによって、関数の共変/反変性チェックルールが変わった。
※ 関数にメソッドとコンストラクタは含まない

--strictFunctionTypes フラグ 関数 メソッド コンストラクタ
無効 双変(bivariant) 双変(bivariant) 双変(bivariant)
有効 反変(contravariant) 双変(bivariant) 双変(bivariant)
class Animal {}
class Dog extends Animal {
    bark(): void {}
}
class Cat extends Animal {
    meow(): void {}
}

declare let animalF: (x: Animal) => void;
declare let dogF: (x: Dog) => void;
declare let catF: (x: Cat) => void;

// 共変(covariant)の場合代入できるケース
//  * [NG] `--strictFunctionTypes` が有効なら反変(contravariant)ルールに従うため
//  * [OK] `--strictFunctionTypes` が無効 または v2.6より前は双変(bivariant)ルールに従うため
animalF = dogF

// 反変(contravariant)の場合代入できるケース
//  * [OK] `--strictFunctionTypes` が有効なら反変(contravariant)ルールに従うため
//  * [OK] `--strictFunctionTypes` が無効 または v2.6より前は双変(bivariant)ルールに従うため
dogF = animalF

// 今も昔もエラー
dogF = catF
class Animal {}
class Dog extends Animal {
  bark(): void {}
}

interface Comparer<T> {
  compare: (a: T, b: T) => number;
}

declare let animalComparer: Comparer<Animal>;
declare let dogComparer: Comparer<Dog>;

// 共変(covariant)の場合代入できるケース
//  * [NG] `--strictFunctionTypes` が有効なら反変(contravariant)ルールに従うため
//  * [OK] `--strictFunctionTypes` が無効 または v2.6より前は双変(bivariant)ルールに従うため
animalComparer = dogComparer

// 反変(contravariant)の場合代入できるケース
//  * [OK] `--strictFunctionTypes` が有効なら反変(contravariant)ルールに従うため
//  * [OK] `--strictFunctionTypes` が無効 または v2.6より前は双変(bivariant)ルールに従うため
dogComparer = animalComparer
class Animal {}
class Dog extends Animal {
  bark(): void {}
}

interface Comparer<T> {
  compare(a: T, b: T): number;
}

declare let animalComparer: Comparer<Animal>;
declare let dogComparer: Comparer<Dog>;

// 共変(covariant)の場合代入できるケース
//  * [OK] 宣言がメソッドで、メソッドパラメータのみにTが使われる場合は双変(bivariant)ルールに従うため
animalComparer = dogComparer

// 反変(contravariant)の場合代入できるケース
//  * [OK] 宣言がメソッドで、メソッドパラメータのみにTが使われる場合は双変(bivariant)ルールに従うため
dogComparer = animalComparer

Cache tagged template objects in modules

NOT NECESSARY EASY

タグ付けテンプレートの中身が一緒なら、同じオブジェクトを使い回すようになった。

export function double(strs: TemplateStringsArray, ...values: number[]) {
  return strs.reduce((accum, str, i) => `${accum}${values[i - 1] * 2}${str}`);
}

const res1 = double`${1} is one, ${2} is two, ${100} is hundred!`;
const res2 = double`${1} is one, ${2} is two, ${100} is hundred!`;

// 2.5以上 -> false (毎回別のObjectが作られる)
// 2.6以上 -> true  (前にキャッシュしたObjectを返す)
console.log(res1 === res2);

Localized diagnostics on the command line

SHOULD EASY

tsc--localを指定すると、特定言語でLocalizeされた結果が表示されるようになった。

tsc --initに指定すると、tsconfig.jsonが日本語出力されるので便利かも。

$ tsc --init --locale ja-jp

Suppress errors in .ts files using ‘// @ts-ignore’ comments

HAD BETTER EASY

// @ts-ignoreコメントを上の行に付けると、全てのエラーを抑制する。
できれば情報として、抑制するエラーを@ts-ignore: Unreachable code errorのように書いておいてほうがいい。

// @ts-ignore
hoge.hoge
// エラーにならない!
公式ではjsファイルを抑制すると書いてある..

TypeScript 2.6 support suppressing errors in .js files using // @ts-ignore comments placed above the offending lines.

とあるが、JavaScriptでは抑制できなかった。
確認バージョンが3.8なので、どこかで仕様が変わったのかも..?

Faster tsc --watch

NOT NECESSARY EASY

tsc --watchによる監視ビルドの速度が上がった。
以下2つの対応をしたことによる。

  • 変更されたモジュールとそれに依存するファイルのみをリビルドするようになった
  • 監視のロジックを見直した

ファイル数の多いプロジェクトでは効果が大きそう。

Write-only references now flagged as unused

NOT NECESSARY EASY

--noUnusedLocals--noUnusedParametersオプションにおけるunusedの条件が変わった。

バージョン 宣言だけ 宣言+代入 宣言+代入+参照
v2.5以前 unused used used
v2.6以降 unused unused used
// 宣言のみ (unused)
let x;

// 宣言+代入 (unused)
const y = 10;

// 宣言+代入+参照 (used)
const z = 10;
console.log(z)