Если вы хотите сделать это безопасным для типов способом, вам нужно будет определить разные типы для разных наборов способностей:
type InanimateAbility =
| Stay
type AnimateAbility =
| Jump
| Run
| Walk
type Ability =
| Inanimate of InanimateAbility
| Animate of AnimateAbility
type Person = {
abilities : Ability Set
}
type InanimateObject = {
abilities : InanimateAbility Set
}
Здесь InanimateAbility
- это тип для способностейчто есть только у неодушевленных объектов, а AnimateAbility
- это тип способностей, уникальных для одушевленных объектов.Ability
сочетает в себе оба из них и представляет любые виды способностей.Person
может иметь набор Abilitiy
значений, но вы можете ограничить способности InanimateObject
набором InanimateAbility
значений.
Это прекрасно работает, если у вас не слишком многокомбинации - если у вас было четыре различных типа объектов с различными подмножествами способностей, то это может стать грязным.В этом случае вы, вероятно, просто используете один тип с проверкой во время выполнения, чтобы убедиться, что вы назначаете только разрешенные способности каждому объекту.