Просмотр исходного кода

types(defineProps): avoid never props becoming boolean flags (#14059)

close #14056
edison 4 месяцев назад
Родитель
Сommit
f33b308102

+ 10 - 0
packages-private/dts-test/setupHelpers.test-d.ts

@@ -33,6 +33,16 @@ describe('defineProps w/ type declaration', () => {
   expectType<boolean>(props.boolAndUndefined)
 })
 
+describe('defineProps w/ never prop', () => {
+  const props = defineProps<{
+    foo?: never
+    bar: number
+  }>()
+
+  expectType<never | undefined>(props.foo)
+  expectType<number>(props.bar)
+})
+
 describe('defineProps w/ generics', () => {
   function test<T extends boolean>() {
     const props = defineProps<{ foo: T; bar: string; x?: boolean }>()

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

@@ -98,8 +98,10 @@ export type DefineProps<T, BKeys extends keyof T> = Readonly<T> & {
 }
 
 type BooleanKey<T, K extends keyof T = keyof T> = K extends any
-  ? [T[K]] extends [boolean | undefined]
-    ? K
+  ? T[K] extends boolean | undefined
+    ? T[K] extends never | undefined
+      ? never
+      : K
     : never
   : never