diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts index 258ae7966e..ac1f19f707 100644 --- a/packages/frontend/src/os.ts +++ b/packages/frontend/src/os.ts @@ -166,14 +166,16 @@ type ComponentProps = PropsWithRefs>; type Decrement = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; type OverloadToUnion = D extends 0 ? never : T extends (...args: infer A) => infer R ? ((...args: A) => R) | OverloadToUnion R) & infer Rest ? Rest : never, Decrement[D]> : never; -type ComponentEmitsObject, IE = OverloadToUnion> = { +type ComponentEmitsObject>> = { [K in IE extends (evName: infer U, ...args: any[]) => any ? U extends string ? U : never : never]: IE extends (evName: K, ...args: infer A) => infer R ? (...args: A) => R : never; }; +// NOTE: ジェネリック型つきのコンポーネントでは、emitsの型推論がうまく働かない(型変数を取り出すことはできないため) +// OverloadToUnionに再帰回数の制限を設けているのもそのため export function popup = CP>( component: T, props: PropsWithRefs

, - events: Partial>>> = {}, + events: Partial>> = {}, ): { dispose: () => void } { markRaw(component); @@ -307,8 +309,6 @@ type ActionsAction = { danger?: boolean; }; -// TODO: const T extends ... にしたい -// https://zenn.dev/general_link/articles/813e47b7a0eef7#const-type-parameters export function actions(props: { type: 'error' | 'info' | 'success' | 'warning' | 'waiting' | 'question'; title?: string;