Thanks to @harrysolovay
type Rock = { b?: never, c?: unknown }
type Paper = { a?: unknown, c?: never }
type Scissors = { a?: never, b?: unknown }
type Beats<A extends B, B> = {}
let a: Beats<Rock, Paper> // will throw error eg in Beats<Rock, Paper>, but not in Beats<Paper, Rock>
An amazing concept is that typescript types are Turing complete, so you can do jawdropping things like an SQL database implementation in just typescript types.