type AActionType = 'AAction'; const AActionType: AActionType = 'AAction'; type BActionType = 'BAction'; const BActionType: BActionType = 'BAction'; type CActionType = 'CAction'; const CActionType: CActionType = 'CAction'; interface Person{ name: string; age: number; height: number; } interface Action{ $name; } interface AAction extends Action{ $name: AActionType; aProp: number; } interface BAction extends Action{ $name: BActionType; bProp: string; } interface CAction extends Action{ $name: CActionType; cProp: Person; } type Actions = AAction | BAction | CAction; function handleAction(action: Actions){ if (action.$name === CActionType){ action.cProp.name; } }