TypeScript サブタイプについて

A <: B は、AはBのサブタイプである、と言う意味である。

この場合、Bを期待するところでAを使うことができる。

以下の例であてはめると、TreeNodeがBでLeafNodeがAになる。

type TreeNode = {
    value: string
}
type LeafNode = TreeNode & {
    isLeaf: true
}

const a: LeafNode = {value: 'a', isLeaf: true}
const b: TreeNode = a //OK
const c: TreeNode = {value: 'c', isLeaf: true} //Type '{ value: string; isLeaf: boolean; }' is not assignable to type 'TreeNode'.

LeafNode <: TreeNode なので、TreeNodeを期待するところでLeafNodeが使える。

そのため、変数bへの割り当てはOKになる。

ただし、変数cの割り当てに関しては、おそらく {value: string, isLeaf: tree} というリテラルをTreeNodeに割り当てると解釈されるためNGとなる。