Maybe:
struct ConstrainedSymbol{T}
a::Symbol
ConstrainedSymbol(a) = ConstrainedSymbol{Any}(a)
ConstrainedSymbol{Any}(a) = new{Any}(a)
ConstrainedSymbol{T}(a) where {T} = a in T ? new{T}(a) : throw("Symbol :$a is not in the supported set of symbols $T.")
end
Base.convert(::Type{Symbol}, s::ConstrainedSymbol) = s.a
Base.Symbol(s::ConstrainedSymbol) = s.a
julia> s = ConstrainedSymbol{(:a, :b)}(:a)
ConstrainedSymbol{(:a, :b)}(:a)
julia> s = ConstrainedSymbol{(:a, :b)}(:b)
ConstrainedSymbol{(:a, :b)}(:b)
julia> s = ConstrainedSymbol{(:a, :b)}(:c)
ERROR: "Symbol :c is not in the supported set of symbols (:a, :b)."
Stacktrace:
[1] ConstrainedSymbol{(:a, :b)}(::Symbol) at .\REPL[1]:6
[2] top-level scope at none:0
julia> s = ConstrainedSymbol(:c)
ConstrainedSymbol{Any}(:c)
julia> Symbol(s)
:c