MicrosoftはJavaScriptのスーパーセットでオープンソースであるTypeScriptのバージョン1.8をリリースした。
先月の言語の ベータ発表に続いて、MicrosoftのプログラムマネージャーであるBowden Kelly氏は、JavaScriptコードをTypeScriptプロジェクトに取り込むことができ、最新バージョンでは"モジュール拡張のフルサポートを提供"するTypeScript 1.8の発表というブログ投稿をした。
タイトルの通り、既存のモジュールを拡張しやすくなり、モジュール全体または一部をインポートしたいときにそれらを選択しやすくなるため、Kelly氏は「モジュール拡張によってユーザーはさらにモジュールライブラリを設計することができるようになる」と言う。これは周辺モジュール宣言の追加と既存の型の拡張によって実現される。
Kelly氏は以下の例を提示した:
// scale.ts
export class Scale {
weightOnEarth(mass) {}
}
// advancedScale.ts
import { Scale } from "./scale" ;
// create augmentation for Scale
declare module "./scale" {
// インターフェイス統合によるコアクラスの拡張
interface Scale {
weightOnMoon(mass); // みんながmoon weightを必要とするわけではない
}
}
Scale.prototype.advancedMethod = /* 実装を挿入 */;
// consumer.ts
import { Scale } from "./scale";
import "./advancedScale";
let scale: Scale;
scale.weightOnMoon(10); // ok
Microsoftは昨年9月のバージョン1.6ベータリリースでReactのサポートを開始して、バージョン1.8の安定リリースでReactのprops
型の宣言を簡素化した。
端的に言うと、開発者はref
とkey
や拡張React.Props
を明示的に宣言する必要がなくなる。その上、この更新ではref
とkey
プロパティはすべてのコンポーネントで正しい型を表示することを意味し、ref
はステートレス関数コンポーネントのインスタンスで正しく許可されていない。
TypeSccript 1.8の改善は言語のunion/intersection型推論であり、たとえばstring | string[]
はstring | T
に推論され、T
はstring[]
に復元されるため、T
はstring[]
に推論される。
type Maybe<T> = T | void;
function isDefined<T>(x: Maybe<T>): x is T {
return x !== undefined && x !== null;
}
function isUndefined<T>(x: Maybe<T>): x is void {
return x === undefined || x === null;
}
function getOrElse<T>(x: Maybe<T>, defaultValue: T): T {
return isDefined(x) ? x : defaultValue;
}
function test1(x: Maybe<string>) {
let x1 = getOrElse(x, "Undefined"); // string
let x2 = isDefined(x) ? x : "Undefined"; // string
let x3 = isUndefined(x) ? "Undefined" : x; // string
}
function test2(x: Maybe<number>) {
let x1 = getOrElse(x, -1); // number
let x2 = isDefined(x) ? x : -1; // number
let x3 = isUndefined(x) ? -1 : x; // number
}
TypeScript 1.8の変更の完全な詳細はプロジェクトのGitHubであるここにある。