Skip to content

Commit 8719468

Browse files
feat(language-core): support defineSlots destructuring (#4312)
Co-authored-by: Johnson Chu <[email protected]>
1 parent cad85aa commit 8719468

File tree

4 files changed

+50
-3
lines changed

4 files changed

+50
-3
lines changed

packages/language-core/lib/codegen/script/scriptSetup.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,17 @@ function* generateSetupFunction(
162162
}
163163
}
164164
}
165-
if (scriptSetupRanges.slots.define && !scriptSetupRanges.slots.name) {
166-
setupCodeModifies.push([[`const __VLS_slots = `], scriptSetupRanges.slots.define.start, scriptSetupRanges.slots.define.start]);
165+
if (scriptSetupRanges.slots.define) {
166+
if (!scriptSetupRanges.slots.name) {
167+
setupCodeModifies.push([[`const __VLS_slots = `], scriptSetupRanges.slots.define.start, scriptSetupRanges.slots.define.start]);
168+
}
169+
else if (scriptSetupRanges.slots.isObjectBindingPattern) {
170+
setupCodeModifies.push([
171+
[`__VLS_slots;\nconst __VLS_slots = `],
172+
scriptSetupRanges.slots.define.start,
173+
scriptSetupRanges.slots.define.start,
174+
]);
175+
}
167176
}
168177
if (scriptSetupRanges.emits.define && !scriptSetupRanges.emits.name) {
169178
setupCodeModifies.push([[`const __VLS_emit = `], scriptSetupRanges.emits.define.start, scriptSetupRanges.emits.define.start]);

packages/language-core/lib/parsers/scriptSetupRanges.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export function parseScriptSetupRanges(
2323
} = {};
2424
const slots: {
2525
name?: string;
26+
isObjectBindingPattern?: boolean;
2627
define?: ReturnType<typeof parseDefineFunction>;
2728
} = {};
2829
const emits: {
@@ -185,7 +186,12 @@ export function parseScriptSetupRanges(
185186
else if (vueCompilerOptions.macros.defineSlots.includes(callText)) {
186187
slots.define = parseDefineFunction(node);
187188
if (ts.isVariableDeclaration(parent)) {
188-
slots.name = getNodeText(ts, parent.name, ast);
189+
if (ts.isIdentifier(parent.name)) {
190+
slots.name = getNodeText(ts, parent.name, ast);
191+
}
192+
else {
193+
slots.isObjectBindingPattern = ts.isObjectBindingPattern(parent.name);
194+
}
189195
}
190196
}
191197
else if (vueCompilerOptions.macros.defineEmits.includes(callText)) {

packages/tsc/tests/__snapshots__/dts.spec.ts.snap

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,25 @@ type __VLS_WithTemplateSlots<T, S> = T & {
742742
"
743743
`;
744744
745+
exports[`vue-tsc-dts > Input: template-slots/component-destructuring.vue, Output: template-slots/component-destructuring.vue.d.ts 1`] = `
746+
"declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>, Readonly<{
747+
bottom: (props: {
748+
num: number;
749+
}) => any[];
750+
}> & {
751+
bottom: (props: {
752+
num: number;
753+
}) => any[];
754+
}>;
755+
export default _default;
756+
type __VLS_WithTemplateSlots<T, S> = T & {
757+
new (): {
758+
$slots: S;
759+
};
760+
};
761+
"
762+
`;
763+
745764
exports[`vue-tsc-dts > Input: template-slots/component-no-script.vue, Output: template-slots/component-no-script.vue.d.ts 1`] = `
746765
"declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>, {
747766
"no-bind"?(_: {}): any;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<template>
2+
<component-destructure #bottom="{ num }">
3+
{{ num }}
4+
</component-destructure>
5+
6+
<bottom :num="1" />
7+
</template>
8+
9+
<script setup lang="ts">
10+
const { bottom } = defineSlots<{
11+
bottom: (props: { num: number }) => any[],
12+
}>()
13+
</script>

0 commit comments

Comments
 (0)