Question 1: the type NTuple{k, T} where {k, T<:Test1} doesn’t work because that defines a tuple type where all values are the same subtype of Test1. Indeed it works if you have Test1 instances of the same concrete type:
julia> (Test1("1", :b), Test1("2", :c)) isa NTuple{k, T} where {k, T<:Test1}
true
(Note that instead of typeof(x) <: T I used the simpler form x isa T.)
What you want is still easy to achieve because tuples (unlike other types in Julia) are covariant. For example one has Tuple{Int,Float64} <: Tuple{Number,Number} (no need to write <:Number). Similarly in your case you can use:
julia> b isa NTuple{K, Test1} where K
true
and there’s even a short version for this using Vararg:
julia> b isa Tuple{Vararg{Test1}}
true
Question 2: for named tuples it’s trickier because they are not covariant, but since the types are encoded with a tuple (which is covariant) it’s still easy to do:
julia> c isa NamedTuple{names, <:Tuple{Vararg{Test1}}} where {names}
true