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'.
}
```