Comments (2)
I opened #58637. This PR ensures we give errors for function declaration/class methods as well. It also only errors if the type doesn't syntactically contain undefined, and if the type can't be proven to not contain undefined. This means that number[]
or T | undefined
will not error, since for the first we know it does not contain undefined
(so we could add it) and for the second we know it does. The only case that will error is where the type of the parameter is a type reference such as T
for which we would need to lookup type information to determine if it contains undefined
or not.
There is an argument to be made that this need not be an error at all. If we always add | undefined
one of two things can happen: either T
already contains undefined
and thus the extra union is redundant but semantically equivalent, or T
does not contain undefined
in which case it should have been added. This does create a situation where if we align emit, TSC will seem silly. The bugs write themselves: Why is TS not smart enough to realize that T already has undefined
in it and is adding this redundant union to my parameter type.
I would be happy if we were to not need an error here. @weswigham do you think adding | undefined
to the type regardless would be a big source of bugs with resolution: "we did this intentionally"?
from typescript.
Obviously it's semantically equivalent to add an | undefined
onto a type that already has an undefined
, so it'd do nothing. But at the same time, we don't have a good reason to regress our emit and blindly add | undefined
in all cases. It should certainly be fine for an emitter to do so, and should simplify things for it greatly, but we don't have a reason to do so in the general case. transpileDeclaration
might need to, since it has to handle non-resolving type nodes that it can't determine the undefined
-ness of, but I can't really see a compelling reason to adjust normal declaration emit output. It'd just produce stuff like Alias | undefined
even when type Alias = Foo | undefined
, which just.... isn't gonna feel great.
So I can see adjusting the fallback behavior for non-resolving types to be adding | undefined
to the existing node - that'll probably help transpileDeclaration
. I'm just less sure about changing the behavior more broadly. We've said a couple times that while we're happy to take improvements to declaration emit that happen to cause alignment (preserving original intent more by copying more nodes as originally written being the big one), we're not really interested in making our normal output match 1:1 with what something limited could produce just for the sake of it.
from typescript.
Related Issues (20)
- Fail to infer Indexed access to the intersection type when it includes an union derived from a generic input HOT 1
- Generators can return undefined values HOT 1
- Inconsistent behaviour of `-?` HOT 4
- Function parameter type inference error HOT 4
- FETCH / Give The json() Function The Power To Use Generic Type HOT 1
- TS 5.6 requires composite projects with noEmit to have fully accessible types, unlike 5.5 HOT 6
- useVsCodeWatcher interferes with updating typescript @aliased imports paths on file or folder moves HOT 2
- Switch typeguard for single case HOT 2
- `AutoFill` is missing a few valid tokens for the `autocomplete` attribute HOT 2
- Cannot read properties of undefined (reading 'charCount') HOT 1
- `tsBuildInfoFile` compiler option should be allowed without `incremental` or `composite` in Typescript versions `>5.6`
- super() typed as returning void HOT 2
- Move to File does not generate imports in the same way that autoimports does
- Move To File makes extra spaces when moving jsdoc comments
- (JSDoc, JavaScript) Imported class types by require() are unresolved HOT 1
- Type all exported members according to some interface HOT 2
- JSDoc typed function comments inside functions
- Error when accessing CSS property value using kebab case in `CSSStyleDeclaration` object HOT 1
- Type 'never' incorrectly inferred for mixed primitive type properties assignment with strictNullChecks disabled HOT 2
- Array of object unions not working as expected HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from typescript.