diff --git a/packages/language-core/lib/codegen/globalTypes.ts b/packages/language-core/lib/codegen/globalTypes.ts index 1f7c027f01..a4a37e55a8 100644 --- a/packages/language-core/lib/codegen/globalTypes.ts +++ b/packages/language-core/lib/codegen/globalTypes.ts @@ -87,6 +87,26 @@ export function generateGlobalTypes(lib: string, target: number, strictTemplates '__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: infer Ctx } ? Ctx : never : any , T extends (props: any, ctx: infer Ctx) => any ? Ctx : any >>; + type __VLS_IsUnion = T extends U ? [U] extends [T] ? false : true : false; + type __VLS_InferUnionType = K extends keyof T ? T[K] : K extends keyof U ? U[K] : never; + type __VLS_UnionKeys = T extends any ? keyof T : never; + type __VLS_UnionRequiredKeys> = Exclude>; + type __VLS_UnionOptionalKeys> = T extends any + ? K extends keyof T + ? {} extends Pick + ? K + : never + : never + : never; + type __VLS_MergeUnion = T extends any + ? { [V in __VLS_UnionRequiredKeys]: __VLS_InferUnionType } + & { [V in __VLS_UnionOptionalKeys]?: __VLS_InferUnionType } + : never; + type __VLS_PrettifyUnion = { + [K in __VLS_UnionRequiredKeys]: T[K] + } & { + [K in __VLS_UnionOptionalKeys]?: T[K] + }; function __VLS_getVForSourceType(source: number): [number, number, number][]; function __VLS_getVForSourceType(source: string): [string, number, number][]; diff --git a/packages/language-core/lib/codegen/localTypes.ts b/packages/language-core/lib/codegen/localTypes.ts index d4939c3bf6..acab9fa2e1 100644 --- a/packages/language-core/lib/codegen/localTypes.ts +++ b/packages/language-core/lib/codegen/localTypes.ts @@ -59,20 +59,13 @@ type __VLS_PropsChildren = { ); const TypePropsToOption = defineHelper( `__VLS_TypePropsToOption`, - () => compilerOptions.exactOptionalPropertyTypes ? - ` -type __VLS_TypePropsToOption = { - [K in keyof T]-?: {} extends Pick - ? { type: import('${vueCompilerOptions.lib}').PropType } - : { type: import('${vueCompilerOptions.lib}').PropType, required: true } -}; -`.trimStart() : - ` -type __VLS_NonUndefinedable = T extends undefined ? never : T; -type __VLS_TypePropsToOption = { - [K in keyof T]-?: {} extends Pick - ? { type: import('${vueCompilerOptions.lib}').PropType<__VLS_NonUndefinedable> } - : { type: import('${vueCompilerOptions.lib}').PropType, required: true } + () => ` +${compilerOptions.exactOptionalPropertyTypes ? '' : 'type __VLS_NonUndefinedable = T extends undefined ? never : T;'} +type __VLS_TypePropsToOption extends true ? __VLS_PrettifyUnion<__VLS_MergeUnion> : T> = { + [K in keyof U]-?: { + type: import('${vueCompilerOptions.lib}').PropType<${compilerOptions.exactOptionalPropertyTypes ? 'U[K]' : '__VLS_NonUndefinedable'}>, + required: {} extends Pick ? false : true + } }; `.trimStart() ); diff --git a/packages/language-core/lib/codegen/template/elementEvents.ts b/packages/language-core/lib/codegen/template/elementEvents.ts index 57f57c4c74..e22f400c3b 100644 --- a/packages/language-core/lib/codegen/template/elementEvents.ts +++ b/packages/language-core/lib/codegen/template/elementEvents.ts @@ -43,7 +43,9 @@ export function* generateElementEvents( } yield `(${newLine}`; yield `__VLS_IsFunction extends true${newLine}`; - yield `? typeof ${propsVar}${newLine}`; + yield `? {${newLine}`; + yield `${originalPropNameObjectKey}?: typeof ${propsVar}['${originalPropName}']${newLine}`; + yield `}${newLine}`; yield `: __VLS_IsFunction extends true${newLine}`; yield `? {${newLine}`; yield `/**__VLS_emit,${emitVar},${prop.arg.loc.source}*/${newLine}`; diff --git a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap index 8e2099a109..900b157b2a 100644 --- a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap +++ b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap @@ -328,23 +328,21 @@ exports[`vue-tsc-dts > Input: reference-type-model/component.vue, Output: refere "qux"?: string; quxModifiers?: Record<'lazy' | 'trim', true>; }; -declare const _default: import("vue").DefineComponent>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, { +declare const _default: import("vue").DefineComponent>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, { "update:foo": (foo: number) => void; "update:bar": (bar: string[]) => void; "update:qux": (qux: string) => void; -}, string, import("vue").PublicProps, Readonly>> & Readonly<{ +}, string, import("vue").PublicProps, Readonly>> & Readonly<{ "onUpdate:foo"?: (foo: number) => any; "onUpdate:bar"?: (bar: string[]) => any; "onUpdate:qux"?: (qux: string) => any; }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; export default _default; type __VLS_NonUndefinedable = T extends undefined ? never : T; -type __VLS_TypePropsToOption = { - [K in keyof T]-?: {} extends Pick ? { - type: import('vue').PropType<__VLS_NonUndefinedable>; - } : { - type: import('vue').PropType; - required: true; +type __VLS_TypePropsToOption extends true ? __VLS_PrettifyUnion<__VLS_MergeUnion> : T> = { + [K in keyof U]-?: { + type: import('vue').PropType<__VLS_NonUndefinedable>; + required: {} extends Pick ? false : true; }; }; " @@ -352,10 +350,10 @@ type __VLS_TypePropsToOption = { exports[`vue-tsc-dts > Input: reference-type-props/component.vue, Output: reference-type-props/component.vue.d.ts 1`] = ` "import { MyProps } from './my-props'; -declare const _default: import("vue").DefineComponent, { +declare const _default: import("vue").DefineComponent, { bar: number; baz: () => string[]; -}>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly, { +}>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly, { bar: number; baz: () => string[]; }>>> & Readonly<{}>, { @@ -369,12 +367,10 @@ type __VLS_WithDefaults = { }> : P[K]; }; type __VLS_NonUndefinedable = T extends undefined ? never : T; -type __VLS_TypePropsToOption = { - [K in keyof T]-?: {} extends Pick ? { - type: import('vue').PropType<__VLS_NonUndefinedable>; - } : { - type: import('vue').PropType; - required: true; +type __VLS_TypePropsToOption extends true ? __VLS_PrettifyUnion<__VLS_MergeUnion> : T> = { + [K in keyof U]-?: { + type: import('vue').PropType<__VLS_NonUndefinedable>; + required: {} extends Pick ? false : true; }; }; type __VLS_PrettifyLocal = { diff --git a/test-workspace/tsc/passedFixtures/vue2/tsconfig.json b/test-workspace/tsc/passedFixtures/vue2/tsconfig.json index cc86334474..648f05fa46 100644 --- a/test-workspace/tsc/passedFixtures/vue2/tsconfig.json +++ b/test-workspace/tsc/passedFixtures/vue2/tsconfig.json @@ -26,6 +26,7 @@ "../vue3/#4649", "../vue3/#4777", "../vue3/#4820", + "../vue3/core#12110", "../vue3/components", "../vue3/defineEmits", "../vue3/defineModel", diff --git a/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json b/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json index 8a5d76fcfa..ac98bde3b2 100644 --- a/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json +++ b/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json @@ -12,6 +12,7 @@ "../vue3/#3820", "../vue3/#4777", "../vue3/#4820", + "../vue3/core#12110", "../vue3/rootEl", "../vue3/templateRef", "../vue3/templateRef_native", diff --git a/test-workspace/tsc/passedFixtures/vue3/core#12110/comp.vue b/test-workspace/tsc/passedFixtures/vue3/core#12110/comp.vue new file mode 100644 index 0000000000..0d6309d91a --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3/core#12110/comp.vue @@ -0,0 +1,16 @@ + diff --git a/test-workspace/tsc/passedFixtures/vue3/core#12110/main.vue b/test-workspace/tsc/passedFixtures/vue3/core#12110/main.vue new file mode 100644 index 0000000000..396c6e5950 --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3/core#12110/main.vue @@ -0,0 +1,9 @@ + + +