Description
TC39 Update
- Class fields to stage 4
useDefineForClassFields
?- Nicer emit ESNext, ES2022
- Import assertions
- Semantics are implementation-defined
- Uh, so just parse and do nothing with it?
- Strange.
Optional vs undefined
-
Can't distinguish whether a property is present vs. when it's undefined.
-
Comes up in functions like React's
setState
.-
You don't want certain properties to be explicitly
undefined
.setState
just allows you to omit properties of existing state. -
Specifically:
this.setState({ foo: "hello", bar: undefined });
has a different meaning in React than
this.setState({ foo: "hello" });
-
-
Previously were considering
missing
as an alternative toundefined
to describe the distinction. It's kind of messy and confusing for people to have another type. -
Idea: have
undefined
affect reading values (i.e. read side of a type), write type only describes the explicitly given type.- Means
obj.a = obj.a
is not always allowed! But kind of correct. - This behavior now also allows you to narrow by
in
and then perform theobj.a = obj.a
assignment.
- Means
-
Breaking change - but if we did it all over again, we'd do it this way.
- So
strict
flag?
- So
-
Automated addition of
| undefined
to a property avoids breaking changes. -
Maybe the case that optionality not including an explicit
undefined
is actually what users meant...but maybe not really? Many (most?) programs probably just check the value of a property.- Similar to whether you want to have an "optional" type that doesn't distinguish between
null
andundefined
. Most programs don't care, but it was useful for us to distinguish between that!
- Similar to whether you want to have an "optional" type that doesn't distinguish between
-
Ship a codemod?
-
Do we support
delete
in control flow analysis?- Don't think so.
- This might kind of force people to do that?
- Could consider doing it.
-
Could also have
?
to mark optionality on an index signature which piece-meal allows you to opt intonoUncheckedIndexedAccess
. -
Very hard to understand how this works on higher-order with mapped types (e.g.
Partial
,Pick
,Required
). -
A way to opt into new semantics?
??
{ x??: string }
-
Mapped types?
type Partial<T> = { [K in keyof T]?: T[K] }
- Does this mean partial includes undefined in every property? Does this break existing code that assumes otherwise?
- Could have a default type argument that specifies whether you wanted to include
undefined
or not.
TSConfig Categorization
- We like it generally.
- Command line?
- Make sure flags all have
--
- No "from", just "values", "arguments", "one of" for option values?
- Make sure flags all have