Describe the bug
Cannot specify tabindex with tabindex="-1" when working with typescript
I have to use tabindex={-1}
To Reproduce
Create a typescript project with npx degit sveltejs/template && node scripts/setupNode.js
REplace you App.svelte with:
<script lang="ts">
export let name: string
let headingEl
</script>
<main>
<h1 bind:this={headingEl} tabindex="-1">Hello {name}!</h1>
<p>Visit the <a href="https://svelte.dev/tutorial">Svelte tutorial</a> to learn how to build Svelte apps.</p>
</main>
and then
$ npm run validate
> [email protected] validate /home/sas/devel/apps/mdn/mdn-svelte-tutorial/08-typescript-support
> svelte-check
Loading svelte-check in workspace: /home/sas/devel/apps/mdn/mdn-svelte-tutorial/08-typescript-support
Getting Svelte diagnostics...
====================================
/home/sas/devel/apps/mdn/mdn-svelte-tutorial/08-typescript-support/src/components/TodosStatus.svelte:25:45
Error: Type 'string' is not assignable to type 'number'. (ts)
eadingEl} tabindex="-1">{com
System (please complete the following information):
svelte-check]Additional context
Add any other context about the problem here.
note: it used to work ok with
"@tsconfig/svelte": "^1.0.2",
"svelte-check": "^0.1.55",
and now is giving the above error with:
"@tsconfig/svelte": "^1.0.3",
"svelte-check": "^0.1.58",
Same reason as https://github.com/sveltejs/language-tools/issues/336
I think this is an inconvenient but correct behavior
Thanks a lot for your reply.
I see your point, but I find it more annoying than helpful. Is there some way to turn this off, or at least turn it into a warning?
It began throwing this error with svelte-check 0.1.58
This is correct behaviour
It feels strange having to update valid html to make it work. But I understand the reasoning behind it.
We should explain this somewhere in the docs, explaining also the advtanges of such approach. My guess is that many will report it as a bug, like I did.
I would also like it could be turned off with a config file, annotation or something like that.
I'm not sure if it is feasible/maintainable, but what about a list of numeric attributes, and if it's such an attribute try to cast the string to number?
@dummdidumm that would almost be like having the best of both worlds, I have no idea how easy/posible that is
That's probably feasible in svelte2tsx. We can overwrite the quote to mustache when the value of the attribute is a text node and the text could be parse as number, for example tabindex="1". Variable binding can't work though.
You could also detect something like tabindex="na" and issue an error?
Yeah. we can first run a parseFloat against the value. if the result is not NaN, overwrite it to be like this tabindex={1}. Then typescript won't complain about it.
Great! I've just upgraded to [email protected] and it works ok!
But I keep getting the error from vscode:

I tried Restarting Svelte Language server, and also restarting vscode itsefl, also issued an npm update, these are the libs I have:
$ npm list --depth 0
[email protected] xxxxxxx
├── @rollup/[email protected]
├── @rollup/[email protected]
├── @rollup/[email protected]
├── @tsconfig/[email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
└── [email protected]
Is there some way to also apply this fix to vscode?
BTW, thanks a lot for your effort, it's really awesome the work you are all doing, most issues are solved in a couple of hours, I bet there is no commercial support that gets even close to this response!
You are not seeing it in VSCode yet because it's not released yet. svelte-check gets it as part of the nightly builds, the VSCode extension is published "manually". That will happen in a couple of days. If you don't want to wait and are ok with some unstable builds, you can also use the Nightly Build of the extension.
I tried the Nightly bulid and it works perfect, thanks a lot. I still get a bit lost about what component is in charge of doing what, even though in this case it was rather obvious that it was vscode extension's responsibility...