]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(types): remove short syntax support in defineSlots()
authorEvan You <yyx990803@gmail.com>
Mon, 8 May 2023 03:53:49 +0000 (11:53 +0800)
committerEvan You <yyx990803@gmail.com>
Mon, 8 May 2023 03:53:49 +0000 (11:53 +0800)
ref: https://github.com/vuejs/language-tools/issues/2758

packages/dts-test/setupHelpers.test-d.ts
packages/runtime-core/src/apiSetupHelpers.ts
packages/runtime-core/src/component.ts
packages/runtime-core/src/componentPublicInstance.ts
packages/runtime-core/src/componentSlots.ts

index f738e58b9eb6e316421a3e84f10474cc58b2febc..9b68b345268b11a434b72c94f26ee809e1e0b8ec 100644 (file)
@@ -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
index de7426ad32507d083c5f2d7f0622951df5df22aa..554115240b3146c22104d63f382fb111c8e6085b 100644 (file)
@@ -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`)
   }
index 684f028fd5bb42d7cd430e49550d9f9064f6b928..33229630e49b2fd71c980bf6756215a834cf00f4 100644 (file)
@@ -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
     }
index dd2d29670e6a6fc939ce447e4bac55730e6bee9e..79bcedda75917013dd6ca1d27a29a4b175fbffb7 100644 (file)
@@ -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>
index 8f59099d8331fe558ce5da77719d7c4149abb4fa..afc5f03933be39c43c7f242227ed7cc14f4a4e06 100644 (file)
@@ -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]