Start here. This is the direct spoken answer to practice first.
Why this question matters
Pattern matching can make a decision read like the domain, but concise syntax does not remove the need to define null, unknown, and future cases.
I use patterns to combine a type or shape check with extraction of the values needed for the branch. A switch expression is useful when one input maps to one result and every meaningful case is visible together. I handle null explicitly with null or a property pattern that only matches non-null values, and I include a fallback when the input space is open. I keep branch expressions free of unrelated side effects so the switch remains a decision rather than a hidden workflow.