Recursive Type References
タイプを使うかインターフェースを使うかはそれぞれの機能の制約に依るところがあります。
3.7では、type aliasに関する制約のうち、interfaceにはない制約が削除
されました。
これについての詳細はexample:types-vs-interfacesを参照してください。
以前は、定義している型自体の内部で
定義している型を参照することはできませんでした。
これはインターフェースには存在しない制約であり、
回避するには少しの手間が必要でした。
例えば、以下は3.6では実行できません:
type ValueOrArray = T | Array>;
// type aliasとinterfaceを組み合わせた回避策は
次のようなものでした。
type ValueOrArray2 = T | ArrayOfValueOrArray;
interface ArrayOfValueOrArray extends Array> {}
// この制約の削除により、自身を参照することでJSONを包括的に
定義できます。
type Json = string | number | boolean | null | Json[] | { [key: string]: Json };
const exampleStatusJSON: Json = {
available: true,
username: "Jean-loup",
room: {
name: "Highcrest",
// Json型に関数を追加できない
// update: () => {}
},
};
// 3.7ベータ版のリリースノートとPRでより多くのことが学べます:
https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
https://github.com/microsoft/TypeScript/pull/33050