rbs icon indicating copy to clipboard operation
rbs copied to clipboard

Record type with optional keys

Open HoneyryderChuck opened this issue 5 years ago • 3 comments

The record type definition forces all keys to be passed, whereas in most cases, one already handles the case to a default when one of the record values isn't passed. Picking up the linked example:

{ id: Integer, name: String }     # Hash object like `{ id: 31, name: "John" }`
# However, I want to handle
# Hash object like `{ name: "John" }` where id is attributed inside the function
# this isn't handled because I can't define
# { ?id: Integer, name: String } 
# like for kwargs

The only way to support this right now is to repeat all combinations in a type definition, which is a bit brittle.

WDYT?

HoneyryderChuck avatar Dec 05 '20 16:12 HoneyryderChuck

In fact, the existence of the key is not checked in the runtime type checker and Steep also allows omitting optional record keys. (https://github.com/soutaro/steep/pull/256)

So, my intuition is that supporting optional keys is better, but we can postpone working for it after Ruby 3.0.

soutaro avatar Dec 07 '20 16:12 soutaro

@soutaro do you think it's time for devising a plan for this? Caught this again while using steep and stdlib's URI::Generic.build signature, which is currently incorrect, as it expects all options to be passed, whereas they're all optional.

HoneyryderChuck avatar Aug 09 '21 13:08 HoneyryderChuck

I would be also interested in this.

ShalokShalom avatar Jul 28 '22 14:07 ShalokShalom