From 7a1326be065501f82bd4994d532bc5f15e58ae72 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Mon, 27 May 2024 13:52:15 +0200 Subject: [PATCH] fix: handle `this` parameter in TypeScript-annotated functions (#11795) fixes #11731 --- .changeset/fresh-walls-bathe.md | 5 +++++ .../phases/1-parse/remove_typescript_nodes.js | 15 ++++++++++++++- .../runtime-runes/samples/typescript/main.svelte | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 .changeset/fresh-walls-bathe.md diff --git a/.changeset/fresh-walls-bathe.md b/.changeset/fresh-walls-bathe.md new file mode 100644 index 0000000000..153e4671e4 --- /dev/null +++ b/.changeset/fresh-walls-bathe.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: handle `this` parameter in TypeScript-annotated functions diff --git a/packages/svelte/src/compiler/phases/1-parse/remove_typescript_nodes.js b/packages/svelte/src/compiler/phases/1-parse/remove_typescript_nodes.js index bbcd4195d1..0475661aaf 100644 --- a/packages/svelte/src/compiler/phases/1-parse/remove_typescript_nodes.js +++ b/packages/svelte/src/compiler/phases/1-parse/remove_typescript_nodes.js @@ -1,6 +1,17 @@ import { walk } from 'zimmerframe'; import * as b from '../../utils/builders.js'; +/** + * @param {import('estree').FunctionExpression | import('estree').FunctionDeclaration} node + * @param {import('zimmerframe').Context} context + */ +function remove_this_param(node, context) { + if (node.params[0]?.type === 'Identifier' && node.params[0].name === 'this') { + node.params.shift(); + } + return context.next(); +} + /** @type {import('zimmerframe').Visitors} */ const visitors = { ImportDeclaration(node) { @@ -71,7 +82,9 @@ const visitors = { }; } return node; - } + }, + FunctionExpression: remove_this_param, + FunctionDeclaration: remove_this_param }; /** diff --git a/packages/svelte/tests/runtime-runes/samples/typescript/main.svelte b/packages/svelte/tests/runtime-runes/samples/typescript/main.svelte index e991aa7533..3dbf0eeb6f 100644 --- a/packages/svelte/tests/runtime-runes/samples/typescript/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/typescript/main.svelte @@ -2,6 +2,10 @@ interface Hello { message: 'hello' } type Goodbye = { message: 'goodbye' }; + function this_fn(this: any) { + console.log(this); + } + export type { Hello };