summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzyoshoka <107108195+zyoshoka@users.noreply.github.com>2024-02-05 15:02:30 +0900
committerGitHub <noreply@github.com>2024-02-05 15:02:30 +0900
commit0df069494e70eafa7217b79d133bb248865baa85 (patch)
tree6de30e4170b2d1acee6f8ef05d7d03b4fc4d5a9b
parentFix(frontend): クロップ後の解像度が異様に低くなる問題の... (diff)
downloadmisskey-0df069494e70eafa7217b79d133bb248865baa85.tar.gz
misskey-0df069494e70eafa7217b79d133bb248865baa85.tar.bz2
misskey-0df069494e70eafa7217b79d133bb248865baa85.zip
refactor(frontend): `os.popup()`の`events`の型チェックを有効化 (#13165)
-rw-r--r--packages/frontend/src/os.ts18
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;