Skip to content

Commit

Permalink
refactor(frontend): os.popup()eventsの型チェックを有効化
Browse files Browse the repository at this point in the history
  • Loading branch information
zyoshoka committed Feb 5, 2024
1 parent c5ac2ae commit 24e6405
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions packages/frontend/src/os.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,10 @@ export function promiseDialog<T extends Promise<any>>(

let popupIdCount = 0;
export const popups = ref([]) as Ref<{
id: any;
component: any;
id: number;
component: Component;
props: Record<string, any>;
events: Record<string, any>;
}[]>;

const zIndexes = {
Expand All @@ -144,7 +145,18 @@ export function claimZIndex(priority: keyof typeof zIndexes = 'low'): number {
return zIndexes[priority];
}

export async function popup<T extends Component>(component: T, props: ComponentProps<T>, events = {}, disposeEvent?: string) {
// InstanceType<typeof Component>['$emit'] だとインターセクション型が返ってきて
// 使い物にならないので、代わりに ['$props'] から色々省くことで emit の型を生成する
// FIXME: 何故か *.ts ファイルからだと型がうまく取れない?ことがあるのをなんとかしたい
type ComponentEmit<T> = T extends new () => { $props: infer Props }
? EmitsExtractor<Props>
: never;

type EmitsExtractor<T> = {
[K in keyof T as K extends `onVnode${string}` ? never : K extends `on${infer E}` ? Uncapitalize<E> : K extends string ? never : K]: T[K];
};

export async function popup<T extends Component>(component: T, props: ComponentProps<T>, events: ComponentEmit<T> = {} as ComponentEmit<T>, disposeEvent?: keyof ComponentEmit<T>) {
markRaw(component);

const id = ++popupIdCount;
Expand Down

0 comments on commit 24e6405

Please sign in to comment.