# Subtyping NamedTuple

**URL:** <https://discourse.julialang.org/t/subtyping-namedtuple/21585>\
**Category:** General Usage\
**Created:** [March 7, 2019, 4:49pm UTC](https://discourse.julialang.org/t/subtyping-namedtuple/21585 "2019-03-07T16:49:08Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Pier](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pier/32/7335_2.png) [@Pier](https://discourse.julialang.org/u/Pier)\
**Post date:** [March 7, 2019, 4:49pm UTC](https://discourse.julialang.org/t/subtyping-namedtuple/21585/1 "2019-03-07T16:49:08Z")

</div>

Is it possible to subtype NamedTuple?  
I unsuccessfully tried a million variations of “struct MyNamedTuple \<: NamedTuple{}(); end”

---

<div class="post-metadata">

**Author:** ![sdanisch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sdanisch/32/1406_2.png) [@sdanisch](https://discourse.julialang.org/u/sdanisch)\
**Post date:** [March 7, 2019, 5:05pm UTC](https://discourse.julialang.org/t/subtyping-namedtuple/21585/2 "2019-03-07T17:05:36Z")

</div>

No, you can’t, in general, inherit from non abstract types!

There are lots of alternatives though, so this should be rarely needed!

---

<div class="post-metadata">

**Author:** ![dpsanders](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dpsanders/32/3573_2.png) [@dpsanders](https://discourse.julialang.org/u/dpsanders)\
**Post date:** [March 7, 2019, 5:56pm UTC](https://discourse.julialang.org/t/subtyping-namedtuple/21585/3 "2019-03-07T17:56:09Z")

</div>

You can just make a new type and put the NamedTuple inside it. Ie use composition instead of inheritance.

---

<div class="post-metadata">

**Author:** ![Pier](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pier/32/7335_2.png) [@Pier](https://discourse.julialang.org/u/Pier)\
**Post date:** [March 7, 2019, 6:41pm UTC](https://discourse.julialang.org/t/subtyping-namedtuple/21585/4 "2019-03-07T18:41:28Z")

</div>

I know. The reason why I wanted to avoid this solution is because I did not want an additional dot to access the internal NamedTuple.

---

<div class="post-metadata">

**Author:** ![jmert](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jmert/32/3161_2.png) [@jmert](https://discourse.julialang.org/u/jmert)\
**Post date:** [March 7, 2019, 7:02pm UTC](https://discourse.julialang.org/t/subtyping-namedtuple/21585/5 "2019-03-07T19:02:53Z")

</div>

You can overload `Base.getproperty` to do direct access. E.g.

```julia
julia> let nt = Symbol("#nt")
           @eval begin
               struct MyNamedTuple{names,T}
                   $nt::NamedTuple{names,T}
               end
               Base.parent(mnt::MyNamedTuple) = getfield(mnt, $(QuoteNode(nt)))
           end
       end

julia> function Base.getproperty(mnt::MyNamedTuple, sym::Symbol)
           return getproperty(parent(mnt), sym)
       end

julia> nt = MyNamedTuple((a = 1, b = 1))
MyNamedTuple{(:a, :b),Tuple{Int64,Int64}}((a = 1, b = 1))

julia> nt.a
1

```

---

<div class="post-metadata">

**Author:** ![Pier](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pier/32/7335_2.png) [@Pier](https://discourse.julialang.org/u/Pier)\
**Post date:** [March 8, 2019, 10:16am UTC](https://discourse.julialang.org/t/subtyping-namedtuple/21585/6 "2019-03-08T10:16:49Z")

</div>

Awesome! Thanks!
