Open 1nVitr0 opened 5 years ago
Related to #31581
Relevant SO question.
Bikeshedding: I think !
in the type system is generally used to mean "definitely defined" and not "not". Instead you'd probably want to reuse the +
and -
modifier modifiers as introduced in TS2.8.
Relevant SO question.
Thanks @jcalz , somehow I missed that So topic when I googled about this. The '+' / '-' makes sense, in my mind they were more like "add that modifier" and "remove that modifier" than "does it have that modifier?". Will add that to my question.
[1] Here's a relevant SO answer for Optional/Non-Optional filtering.
[2] I think there's one more combination:
type KrequiredEditable = !readonly keyof!? T;
Edit: Silly me; of course 2x2 => 4 combinations:
type KOptionalWritable = !readonly keyof? T;
type KRequiredWritable = !readonly keyof!? T;
type KOptionalReadonly = readonly keyof? T;
type KRequiredReadonly = readonly keyof!? T;
[3] With respect to +/-, they do mean add/remove. I think it may be confused with this existing usage (which means "make writable" not "is writable?"):
export type Writeable<T> = { -readonly [P in keyof T]: T[P] };
Since !
is already used as the non-null assertion operator (and grammatically it feels opposite to ?
), I think using it here provides a clean syntax to filter for non-null/non-undefined (required) keys:
type KOptional = keyof? T; // only optional keys
type KRequired = keyof! T; // only required keys
A more explicit opposite of readonly is "writable":
type KReadonly = readonly keyof T; // only readonly keys
type KWritable = writable keyof T; // only writable keys
I find this much more readable, especially when you consider combinations:
type KOptionalWritable = writable keyof? T;
type KRequiredWritable = writable keyof! T;
type KOptionalReadonly = readonly keyof? T;
type KRequiredReadonly = readonly keyof! T;
Looking for this,
This would be really useful
Search Terms
Suggestion
Adding Support for modifiers to keyof could be very helpful. I'm picturing something like this
The modifiers would act as "filters", only selecting the keys fitting the given modifiers.
As @jcalz pointed out, it might make more sense to use the existing
+
and-
operators instead of the!
.Use Cases
This could be really useful for selecting properties of types based on them being
optional
/readonly
. A possible use case for this would be the ReactdefaultProps
object (see example).Of course this could negatively affect readability as especially Mapped Types can get fairly long
but I think it's still in the realms of comprehensibility.
Examples
Especially with many optional props the current method of
can get fairly tedious, especially as you have to add new optional props at 3 places (the type definition, the
Pick
UtilityType and in thedefaultProps
). The method using PickOptional and the?
-keyof
-modifier reduces it to 2, and immediately notifies you if you declared a parameter optional, but haven't defined it indefaultProps
.This would also work without React in terms of default values:
I'm sure there are more (and better) use cases for this feature I can't think of right now...
Checklist
My suggestion meets these guidelines: