Browse Source

fix(types): remove short syntax support in defineSlots()

ref: https://github.com/vuejs/language-tools/issues/2758
Evan You 3 years ago
parent
commit
1279b17300

+ 0 - 8
packages/dts-test/setupHelpers.test-d.ts

@@ -186,14 +186,6 @@ describe('defineEmits w/ runtime declaration', () => {
 })
 
 describe('defineSlots', () => {
-  // short syntax
-  const slots = defineSlots<{
-    default: { foo: string; bar: number }
-    optional?: string
-  }>()
-  expectType<(scope: { foo: string; bar: number }) => VNode[]>(slots.default)
-  expectType<undefined | ((scope: string) => VNode[])>(slots.optional)
-
   // literal fn syntax (allow for specifying return type)
   const fnSlots = defineSlots<{
     default(props: { foo: string; bar: number }): any

+ 2 - 2
packages/runtime-core/src/apiSetupHelpers.ts

@@ -28,7 +28,7 @@ import {
   PropOptions
 } from './componentProps'
 import { warn } from './warning'
-import { SlotsType, TypedSlots } from './componentSlots'
+import { SlotsType, StrictUnwrapSlotsType } from './componentSlots'
 import { Ref, ref } from '@vue/reactivity'
 import { watch } from './apiWatch'
 
@@ -205,7 +205,7 @@ export function defineOptions<
 
 export function defineSlots<
   S extends Record<string, any> = Record<string, any>
->(): TypedSlots<SlotsType<S>> {
+>(): StrictUnwrapSlotsType<SlotsType<S>> {
   if (__DEV__) {
     warnRuntimeUsage(`defineSlots`)
   }

+ 2 - 2
packages/runtime-core/src/component.ts

@@ -32,7 +32,7 @@ import {
   InternalSlots,
   Slots,
   SlotsType,
-  TypedSlots
+  UnwrapSlotsType
 } from './componentSlots'
 import { warn } from './warning'
 import { ErrorCodes, callWithErrorHandling, handleError } from './errorHandling'
@@ -188,7 +188,7 @@ export type SetupContext<
 > = E extends any
   ? {
       attrs: Data
-      slots: TypedSlots<S>
+      slots: UnwrapSlotsType<S>
       emit: EmitFn<E>
       expose: (exposed?: Record<string, any>) => void
     }

+ 2 - 2
packages/runtime-core/src/componentPublicInstance.ts

@@ -40,7 +40,7 @@ import {
   ComponentInjectOptions
 } from './componentOptions'
 import { EmitsOptions, EmitFn } from './componentEmits'
-import { SlotsType, TypedSlots } from './componentSlots'
+import { SlotsType, UnwrapSlotsType } from './componentSlots'
 import { markAttrsAccessed } from './componentRenderUtils'
 import { currentRenderingInstance } from './componentRenderContext'
 import { warn } from './warning'
@@ -213,7 +213,7 @@ export type ComponentPublicInstance<
   >
   $attrs: Data
   $refs: Data
-  $slots: TypedSlots<S>
+  $slots: UnwrapSlotsType<S>
   $root: ComponentPublicInstance | null
   $parent: ComponentPublicInstance | null
   $emit: EmitFn<E>

+ 6 - 1
packages/runtime-core/src/componentSlots.ts

@@ -41,7 +41,12 @@ export type SlotsType<T extends Record<string, any> = Record<string, any>> = {
   [SlotSymbol]?: T
 }
 
-export type TypedSlots<
+export type StrictUnwrapSlotsType<
+  S extends SlotsType,
+  T = NonNullable<S[typeof SlotSymbol]>
+> = [keyof S] extends [never] ? Slots : Readonly<T>
+
+export type UnwrapSlotsType<
   S extends SlotsType,
   T = NonNullable<S[typeof SlotSymbol]>
 > = [keyof S] extends [never]