GIN is not just for full-text search, so using TSTernaryValue in GinScanKeyData is wrong. And it would break existing extensions.
I didn't look much further than that, but I've got a feeling that combining those is a bad idea. TSTernaryValue is used in text-search code, even when there is no GIN involved. It's a separate concept, even though it happens to have the same values.
Probably you are right. But now the code already rely on equivalent value assignments for GinTernaryValue and TSTernaryValue (in checkcondition_gin()). So my idea was to combine them and use them like we use other global data types. We may declare it somewhere outside both gin and search. Or just leave as it is.