TypeScript チームは最近 TypeScript のバージョン 3.1 を発表した。写像可能なタプルと配列型、そして 3.0 のリリースからのいくつかの改善が含まれている。
ほぼすべての JavaScript アプリケーションはリスト内の値を写像する必要がある。その際はES2015で簡素化された残余引数によるパターンが用いられている。
TypeScript チームによる一般的な例は以下のとおりだ。
function stringifyAll(...elements) {
return elements.map(x => String(x));
}
TypeScript リリースブログによると、
stringifyAll
関数はどんな数の値も受け取り、各要素を文字列に変換し、それぞれの結果を新しい配列に詰め、その配列を返す。もしstringifyAll
のより一般的な形が必要であれば、次のように宣言するだろう。
declare function stringifyAll(...elements: unknown[]): Array<string>;
この例によれば、関数は任意の数の要素を受け取り文字列の配列を返すが、その数の要素の型情報は失われる。以前はその解決策は関数の定義をオーバーロードすることだったが、すぐに不便になってしまう。
declare function stringifyAll(...elements: []): string[];
declare function stringifyAll(...elements: [unknown]): [string];
// ... etc.
TypeScript は mapped object 型を以前のリリースで導入していたが、これはタプルと配列型では期待どおりに動作しなかった。このリリースでの変更により、このアプローチが、暗号めいたエラーメッセージを投げるよりも期待どおりに動作するようになる。
TypeScript リリースブログによると、
振る舞いとして技術的に一貫していますが、我々のチームの大半はこのユースケースがうまくいくだろうと感じていました。タプルでの写像という新しい概念を導入するよりも mapped object 型がタプルや配列で繰り返しをする際に "正しいこと" をします。これが意味するところは、もし lib.d.ts の Partial や Required などの 既存の mapped 型を使用していたら、それらはタプルや配列でも自動的に機能するようになるということです。非常に一般的なことですが、この機能によって TypeScript は Promise.all と同様の関数を表現する準備が整っているということにも気づかれるかもしれません。この特徴的な変更は今回のリリースには含まれていませんが、近い将来に実装されるかもしれません。
3.1 のリリースにおける他の重要な追加は、関数宣言でのプロパティ指定が簡単になったことだ。 React ユーザーはこの機能を defaultProps として馴染みがあるだろう。
JavaScript において関数はただのオブジェクトであるので、関数にプロパティを追加するのは容易だ。この問題に対する TypeScript のもともとの解決策は名前空間だったが、これは ES モジュールを用いる際に課題をもたらし、var
、 let
あるいは const
での宣言がマージされないようになっていた。
TypeScript 3.1 では、関数で初期化された関数宣言や const 宣言は型チェッカーが包含するスコープを解析し、追加されたプロパティを追跡する。
そのほか多くの細かい変更や改善が 3.1 のリリースでなされている。
3.1 のリリース以上に、 TypeScript 3.2 のリリースでは多くの改善がある。最も重要なものは関数での厳格なバインド、呼び出し、メソッド適用 と、コミュニティが4年近く前からリクエストしている複雑な改善だ。この変更はvariadic kindsのパズルのための抜けたピースを補うものであり、これは高次な関数の型付けをサポートできるようにするという非常にチャレンジングな一連の問題である。BigInt のサポート も 3.2 のリリースに含まれるだろう。
TypeScript は Apache 2 ライセンスに基づくオープンソースソフトウェアだ。貢献とフィードバックはTypeScript GitHub プロジェクトへ。
Rate this Article
- Editor Review
- Chief Editor Action