ref: https://yamatatsu-2019-07-16-ts-subtype.netlify.app/ ## 概要 [[JavaScriptのPromiseオブジェクト MOC|Promise]] の型 `Promise<T>` の [[Subtyping MOC|部分型関係]] における [[型理論 変性とは|変性]] は共変 (covariant) となっている。部分型付け規則を書くと以下のようになる。 $ {S_1 <: T_1} \over {Promise \langle S_1 \rangle <: Promise \langle T_1 \rangle} $ 部分型関係 (射) の方向を Preserve するので型 (対象) と部分型関係 (射) の圏において型構築子 `Promise` は共変関手となる。 ## 検証 [[TypeScript MOC|TypeScript]] で実際に検証すると以下のようになる。$Cat <: Animal$ であるから、$Promise \langle Cat \rangle <: Promise \langle Animal \rangle$ となる。 ```ts type isSubtypeOf<Sub, Super> = Sub extends Super ? true : false; { type Animal = "dog" | "cat" | "duck" | "human"; type Cat = "cat"; type AnimalPromise = Promise<Animal>; type CatPromise = Promise<Cat>; // assignability check type C1 = isSubtypeOf<CatPromise, AnimalPromise>; // => true const animalPromise: AnimalPromise = Promise.resolve("cat"); // => 割当OK const catPromise: CatPromise = Promise.resolve("dog") as AnimalPromise; // => 割当NG: Type 'AnimalPromise' is not assignable to type 'CatPromise'. } ```