diff options
| author | zyoshoka <107108195+zyoshoka@users.noreply.github.com> | 2024-02-05 15:02:30 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-05 15:02:30 +0900 |
| commit | 0df069494e70eafa7217b79d133bb248865baa85 (patch) | |
| tree | 6de30e4170b2d1acee6f8ef05d7d03b4fc4d5a9b | |
| parent | Fix(frontend): クロップ後の解像度が異様に低くなる問題の... (diff) | |
| download | misskey-0df069494e70eafa7217b79d133bb248865baa85.tar.gz misskey-0df069494e70eafa7217b79d133bb248865baa85.tar.bz2 misskey-0df069494e70eafa7217b79d133bb248865baa85.zip | |
refactor(frontend): `os.popup()`の`events`の型チェックを有効化 (#13165)
| -rw-r--r-- | packages/frontend/src/os.ts | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts index 7cce77cdf7..010fdbb6d8 100644 --- a/packages/frontend/src/os.ts +++ b/packages/frontend/src/os.ts @@ -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 = { @@ -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; |