[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)