-
-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Description
Describe the problem
Currently there appears to be no way to define a components binding as readonly, this is supported on special inbuilt elements, such as input, video and audio (for example, for "read_only_media_attributes") but Svelte currently lacks support for specifying anything outside of inbuilt elements as a readonly binding.
Looking through the source, it looks like the binding type is decided around here, and is conditioned based on the type of element:
https://github.com/sveltejs/svelte/blob/master/src/compiler/compile/nodes/Binding.ts#L88
Sorry if this has already been discussed but I couldn't find an existing issue covering this topic.
Describe the proposed solution
We should have some way of specifying a readonly binding, for example, by using the reserved export let $variable syntax:
Foo.svelte:
<script>
import {onMount} from 'svelte';
export let $foo = 0;
onMount(() => {
const t = setTimeout(() => {
foo++;
}, 100);
return (() => {
clearTimeout(t)
});
});
</script>App.svelte
<script>
import Foo from './Foo.svelte';
let foo;
</script>
<Foo bind:foo />
<h1>{foo}</h1>I'm not aware of if this syntax is intended for something else, someone might be able to chime in and suggest something that might be better suited and fit in better with the general design of Svelte.
Alternatives considered
We'd like this to warn developers not to write to certain values to components as they won't affect anything, since the component that's providing those bindings is doing some side effect that isn't controllable from the parent component.
If they do, it doesn't directly affect any result (nothing happens), so our alternative solution is just to mark these bindings as readonly in our JSDoc.
Importance
nice to have