forked from mirrors/misskey
refactor(frontend): os.select, MkSelectのitem指定をオブジェクトによる定義に統一し、型を狭める (#16475)
* refactor(frontend): MkSelectのitem指定をオブジェクトによる定義に統一 * fix * spdx * fix * fix os.select * fix lint * add comment * fix * fix: os.select対応漏れを修正 * fix * fix * fix: MkSelectのmodelに対する型チェックを厳格化 * fix * fix * fix * Update packages/frontend/src/components/MkEmbedCodeGenDialog.vue Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> * fix * fix types * fix * fix * Update packages/frontend/src/pages/admin/roles.editor.vue Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> * fix: MkSelectに直接配列を指定している場合に正常に型が解決されるように --------- Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
This commit is contained in:
38
packages/frontend/src/composables/use-mkselect.ts
Normal file
38
packages/frontend/src/composables/use-mkselect.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { ref } from 'vue';
|
||||
import type { Ref, MaybeRefOrGetter } from 'vue';
|
||||
import type { MkSelectItem, OptionValue, GetMkSelectValueTypesFromDef } from '@/components/MkSelect.vue';
|
||||
|
||||
type UnwrapReadonlyItems<T> = T extends readonly (infer U)[] ? U[] : T;
|
||||
|
||||
/** 指定したオプション定義をもとに型を狭めたrefを生成するコンポーサブル */
|
||||
export function useMkSelect<
|
||||
const TItemsInput extends MaybeRefOrGetter<MkSelectItem[]>,
|
||||
const TItems extends TItemsInput extends MaybeRefOrGetter<infer U> ? U : never,
|
||||
TInitialValue extends OptionValue | void = void,
|
||||
TItemsValue = GetMkSelectValueTypesFromDef<UnwrapReadonlyItems<TItems>>,
|
||||
ModelType = TInitialValue extends void
|
||||
? TItemsValue
|
||||
: (TItemsValue | TInitialValue)
|
||||
>(opts: {
|
||||
items: TItemsInput;
|
||||
initialValue?: (TInitialValue | (OptionValue extends TItemsValue ? OptionValue : TInitialValue)) & (
|
||||
TItemsValue extends TInitialValue
|
||||
? unknown
|
||||
: { 'Error: Type of initialValue must include all types of items': TItemsValue }
|
||||
);
|
||||
}): {
|
||||
def: TItemsInput;
|
||||
model: Ref<ModelType>;
|
||||
} {
|
||||
const model = ref(opts.initialValue ?? null);
|
||||
|
||||
return {
|
||||
def: opts.items,
|
||||
model: model as Ref<ModelType>,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user