EmitsToProps,
TypeEmitsToOptions,
} from './componentEmits'
-import { extend, isFunction } from '@vue/shared'
+import { type IsKeyValues, extend, isFunction } from '@vue/shared'
import type { VNodeProps } from './vnode'
import type {
ComponentPublicInstanceConstructor,
ResolvedEmits extends EmitsOptions = {} extends RuntimeEmitsOptions
? TypeEmitsToOptions<TypeEmits>
: RuntimeEmitsOptions,
- InferredProps = unknown extends TypeProps
- ? keyof TypeProps extends never
- ? string extends RuntimePropsKeys
- ? ComponentObjectPropsOptions extends RuntimePropsOptions
- ? {}
- : ExtractPropTypes<RuntimePropsOptions>
- : { [key in RuntimePropsKeys]?: any }
- : TypeProps
- : TypeProps,
+ InferredProps = IsKeyValues<TypeProps> extends true
+ ? TypeProps
+ : string extends RuntimePropsKeys
+ ? ComponentObjectPropsOptions extends RuntimePropsOptions
+ ? {}
+ : ExtractPropTypes<RuntimePropsOptions>
+ : { [key in RuntimePropsKeys]?: any },
TypeRefs extends Record<string, unknown> = {},
TypeEl extends Element = any,
>(
// https://stackoverflow.com/questions/49927523/disallow-call-with-any/49928360#49928360
export type IfAny<T, Y, N> = 0 extends 1 & T ? Y : N
+export type IsKeyValues<T, K = string> = IfAny<
+ T,
+ false,
+ T extends object ? (keyof T extends K ? true : false) : false
+>
+
/**
* Utility for extracting the parameters from a function overload (for typed emits)
* https://github.com/microsoft/TypeScript/issues/32164#issuecomment-1146737709