Description
What problem does this feature solve?
(I'm sure I saw this mentioned somewhere before, but I can't find any issue nor discussion about it. Apologies if it's a dupe.)
For Typescript users, script setup
needs a defineSlots
macro to create strongly typed slots.
The problem is that today the code generated by script setup creates TS compilation errors.
The following template creates an error Binding element 'ok' implicitly has an 'any' type
.
(You have the same error even if you don't destructure the slot value.)
<my-dialog v-slot="{ ok, cancel }">
<button @click="ok()">Close</button>
</my-dialog>
This is quite a blocker because there's no good workaround:
- You can't add type annotations inside templates (and in this instance it would be very ugly very quickly);
- You can't add
ts-ignore
comments in the template. - This errors is only reported with
--noImplicitAny
but that's a strict flag that we really don't want to globally disable in our codebase.
Of course, on top of the TS error, having typed slots would be a nice improvement for Volar.
What does the proposed API look like?
As a quick-fix / workaround, I suggest that the compiler adds // @ts-ignore: implicit any
before the generated slot code.
A better, long term fix would be to allow TS users to type their slots, I suggest:
defineSlots<{
default: {
quantity: number;
order(): void;
}
}>();