victorolinasc
I’d like to propose a silly typespec discussion: what is your style guidelines for writing typespecs?
I mean, do you:
- use parentheses (zero arity functions, types, etc)?
- use private types?
- add docs to your typespecs?
Browsing the “source of truth” (Elixir’s own code base) it seems types aren’t usually documented (for example here) and they don’t use parentheses except for external t() types and zero arity functions.
I haven’t seem libraries add docs to type definitions either. inch_ex does not cover this scenario also (I’m guessing by looking at Plug report).
Some types in the Erlang documentation have a comment (for example here), but usually people just don’t bother documenting it.
I know this is just a typical style discussion, but with a dialyzer task going in standard mix I’d like to know general opinion about this ![]()
Trending in Discussions
A little off-topic, but I feel like people here have a good head on their shoulders.
I used to be quite good at making software. Was luc...
New
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
Hi there! :wave:
@frigidcode and I (but mostly him) have been running an Elixir Book club, we’re almost done with Designing Elixir Syste...
New
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with.
But I don’t use it anymore.
Serverless was the promis...
New
Lately I’ve been thinking about how to organize components as a LiveView application grows. One of the pain points I’ve found (for myself...
New
What IDE or editor are you using for Elixir development?
Personally, I use Zed, and I really like it, but sometimes I wish there were a ...
New
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New
Other Trending Topics
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
In 2021 I started a new library called Tempo with the objective of modelling time as a set of intervals - not as instants. In 2022 I gave...
New
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly)
AI dream has many faces, but general...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #metaprogramming











Showing Posts 1 to 2- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
blatyo
I do whatever the elixir formatter does.
Private types are to my knowledge, only really useful within opaque types. I don’t generally use them because most of my custom types are usually named versions of the basic types. When I define structs, I type them publicly because I think of that as public API. If I were unsure of how I wanted to structure a struct, I might choose to make it opaque in that situation, so that users would only use the module I provide to interact with it. In that case the structure of the struct would be encapsulated in the module’s functions. If I used types only in the definition of the struct, I’d make those private.
I’d say most of the time it’s pretty obvious what the type is from just the name or it’s underlying type. For example, I wouldn’t need an explanation for:
That’s because that’s the way the elixir formatter formats them.
When someone suggested adding something related to typespecs to credo, I seem to remember rrrene mentioning he hadn’t looked much into typespecs yet. So, it’s not a big surprise. I also completely ignored them when I first started Elixir.
I think that’s a good example where the type is opaque, so you need to know how you can create one.
victorolinasc
The formatter only demands parentheses when it is a foreigner type (defined in another module). Otherwise it won’t remove nor add parentheses in any other cases that I am aware of.
I agree that most types are self-explanatory when we are dealing with direct types (just alias of built-in types) like the ones you mention. But when you do
h Jason.encode_to_iodata!/2and we see this spec:@spec encode_to_iodata!(term(), [encode_opt()]) :: iodata() | no_return()It is not obvious what the encode_opt() is. Then we follow it with a
t Jason.encode_opt()and get:And then we keep digging to understand what escape is and so on. The typespecs for Jason are just one example where things aren’t that obvious at first sight IMHO. If we follow the maps definition it will be
@type maps() :: :naive | :strictand I am not sure about the context anymore. What is a naive map here? Then that’s where I go after the source or something.I mean, I mostly agree with your opinions. I just think that currently we are leaving more things undocumented than it would be good (including me) and was curious to see if others agree.