Skip to content

fix: disambiguate arrow function type parameters in JSX - #155

Open
MathiasWP wants to merge 1 commit into
sveltejs:mainfrom
MathiasWP:fix/tsx-generic-arrow
Open

fix: disambiguate arrow function type parameters in JSX#155
MathiasWP wants to merge 1 commit into
sveltejs:mainfrom
MathiasWP:fix/tsx-generic-arrow

Conversation

@MathiasWP

Copy link
Copy Markdown
Contributor

In a JSX file, an arrow function's <T> type parameter list is parsed as the start of a JSX element. The trailing comma that disambiguates it was dropped, so generic arrow functions printed with esrap/languages/tsx no longer compile:

// before
const identity = <T,>(value: T): T => value;      const identity = <T>(value: T): T => value;
// TS17008: JSX element 'T' has no corresponding closing tag.

// after
const identity = <T,>(value: T): T => value;      const identity = <T,>(value: T): T => value;

The comma is only added where the list is actually ambiguous — a second parameter, a constraint or a default already rules JSX out, so <T, U>, <T extends object> and <T = string> are left alone. Modifiers (const, in, out) do not disambiguate, so <const T> gets the comma too.

Two supporting changes:

  • ts() takes an internal second argument set by the tsx module, so this only affects JSX output. The public signature is unchanged.
  • esrap.test.js printed every sample with tsx(), including the .ts ones — it now picks the module matching the sample's jsxMode, so ts-arrow-function-types keeps printing plain <T>.

@pkg-svelte-dev

pkg-svelte-dev Bot commented Aug 5, 2026

Copy link
Copy Markdown

Install the latest version of esrap from 0112377:

pnpm add https://pkg.svelte.dev/esrap/c/0112377125131496165ebf3a4d296bda76b0a841

Open in pkg.svelte.dev: https://pkg.svelte.dev/repos/esrap/pr/155

Note

This PR is from a fork. A maintainer must approve approve each commit before it can be built and installed.

@changeset-bot

changeset-bot Bot commented Aug 5, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0112377

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
esrap Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@dummdidumm

Copy link
Copy Markdown
Member

Thank you! The fix looks good but the claim that this does not change public API is wrong - it's changing the public default export. I don't know how we can solve this without moving everything into a new file but I'd like to avoid adding a second parameter if possible

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants