Vue2.7.14 环境下获取子组件的 defineExpose ,Vue3 效果应该是一样的.如果不一样,请给我留言.我会快速修复.谢谢.
/** 第一步,定义一个辅助公式,用于去除对象中所有的值为never的key */
type OmitNever<T> = Pick<T, { [P in keyof T]: T[P] extends never ? never : P }[keyof T]>;
/** 取得实例的实例,包含props和expose */
type GetComponentInstance<T> = Omit<InstanceType<T>, keyof InstanceType<typeof Vue>>;
/** 取得实例的Props */
type GetComponentProps<T> = InstanceType<T>['$props'];
/** 获取对象的Expose,先取得实例,包含props和expose代号A,再取得props,再从 A 中排除掉 props*/
type GetComponentExpose<T> = OmitNever<{
[Key in keyof GetComponentInstance<T>]: Key extends keyof GetComponentProps<T>
? never
: GetComponentInstance<T>[Key];
}>;
效果展示:
父组件取值:
子组件暴露值:
24/11/3 对于vue3取组件的props方式补充
type GetPropsByComponent<T extends abstract new (...args:any) => any> = Omit<
InstanceType<T>['$props'],keyof VNodeProps | 'class' | 'style'
>