Two recent issues we've observed relatively frequently with our JSX implementation includes the following:
@types/react can have differing declarations of JSX. This is problematic because the JSX namespace is global and these conflicts are surfaced to _users_ rather than library authors. This makes for a bad experience. (#17111)For each of the above issues respectively:
"react" or some such library@mhegazy and I have discussed this, and believe it is worth exploring the idea of resolving JSX namespaces from the same module as the factory function itself. In other words, if the JSX factory is React.createElement, TypeScript should attempt to resolve the JSX namespace from the location of the factory function itself.
Code could temporarily be defined that works in both older and newer versions of TypeScript:
namespace JSX {
// JSX stuff goes in here.
}
export { /*...*/ }
import Temp_JSX = JSX;
declare global {
import JSX = Temp_JSX;
}
Duplicate JSX declaration errors would still be a problem (and potentially exacerbated), but after several versions we could remove the global augmentations.
//cc @RyanCavanaugh
Two separate versions of a
@types/reactcan have differing declarations of JSX. This is problematic because the JSX namespace is global and these conflicts are surfaced to users rather than library authors. This makes for a bad experience.
This isn't just a problem for React. It is a problem for any multi package project where you have cross dependencies and you are trying to work with TypeScript. Projects that have different versions of @types/node or in situations where there is a common library between the two. It would be great to see a more general solution to that.
I really like this idea.
Most helpful comment
This isn't just a problem for React. It is a problem for any multi package project where you have cross dependencies and you are trying to work with TypeScript. Projects that have different versions of
@types/nodeor in situations where there is a common library between the two. It would be great to see a more general solution to that.