ts

// 位置の変更差分を子供全てに適用する
const updatePosition = <T extends StateItem>(item: T, diff: paper.Point): T => {
  const newPosition = item.position.add(diff);
  if (isGroupStateItem(item)) {
    const newChildren = item.items.map((x) => (updatePosition(x, diff)))
    return {
      ...item,
      position: newPosition,
      nameplate: updatePosition(item.nameplate, diff),
      items: newChildren,
    }
  } else {
    return {
      ...item, position: newPosition
    }
  }
}

ジェネリクスが必要な例