diff options
| author | かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> | 2025-08-31 19:53:38 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-31 19:53:38 +0900 |
| commit | c95092903a37159aa73073e31519ed363ed404b7 (patch) | |
| tree | c49e0b7a03202d17a49d05020793f4652f65af6e /packages/frontend/src/components/MkInput.vue | |
| parent | [skip ci] Update CHANGELOG.md (prepend template) (diff) | |
| download | misskey-c95092903a37159aa73073e31519ed363ed404b7.tar.gz misskey-c95092903a37159aa73073e31519ed363ed404b7.tar.bz2 misskey-c95092903a37159aa73073e31519ed363ed404b7.zip | |
refactor(frontend): フロントエンドの型エラー解消(途中まで) (#16477)
* refactor(frontend): フロントエンドの型エラー解消
* fix
---------
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
Diffstat (limited to 'packages/frontend/src/components/MkInput.vue')
| -rw-r--r-- | packages/frontend/src/components/MkInput.vue | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/packages/frontend/src/components/MkInput.vue b/packages/frontend/src/components/MkInput.vue index cc7ad8bb78..0c6f03d7d6 100644 --- a/packages/frontend/src/components/MkInput.vue +++ b/packages/frontend/src/components/MkInput.vue @@ -43,7 +43,15 @@ SPDX-License-Identifier: AGPL-3.0-only </div> </template> -<script lang="ts" setup> +<script lang="ts"> +type SupportedTypes = 'text' | 'password' | 'email' | 'url' | 'tel' | 'number' | 'search'; +type ModelValueType<T extends SupportedTypes> = + T extends 'number' ? number : + T extends 'text' | 'password' | 'email' | 'url' | 'tel' | 'search' ? string : + never; +</script> + +<script lang="ts" setup generic="T extends SupportedTypes = 'text'"> import { onMounted, onUnmounted, nextTick, ref, useTemplateRef, watch, computed, toRefs } from 'vue'; import { debounce } from 'throttle-debounce'; import { useInterval } from '@@/js/use-interval.js'; @@ -55,8 +63,8 @@ import { Autocomplete } from '@/utility/autocomplete.js'; import { genId } from '@/utility/id.js'; const props = defineProps<{ - modelValue: string | number | null; - type?: InputHTMLAttributes['type']; + modelValue: ModelValueType<T> | null; + type?: T; required?: boolean; readonly?: boolean; disabled?: boolean; @@ -83,11 +91,11 @@ const emit = defineEmits<{ (ev: 'change', _ev: KeyboardEvent): void; (ev: 'keydown', _ev: KeyboardEvent): void; (ev: 'enter', _ev: KeyboardEvent): void; - (ev: 'update:modelValue', value: string | number): void; + (ev: 'update:modelValue', value: ModelValueType<T>): void; }>(); -const { modelValue, type, autofocus } = toRefs(props); -const v = ref(modelValue.value); +const { modelValue } = toRefs(props); +const v = ref<ModelValueType<T> | null>(modelValue.value); const id = genId(); const focused = ref(false); const changed = ref(false); @@ -120,8 +128,8 @@ const onKeydown = (ev: KeyboardEvent) => { const updated = () => { changed.value = false; - if (type.value === 'number') { - emit('update:modelValue', typeof v.value === 'number' ? v.value : parseFloat(v.value ?? '0')); + if (props.type === 'number') { + emit('update:modelValue', typeof v.value === 'number' ? v.value as ModelValueType<T> : parseFloat(v.value ?? '0') as ModelValueType<T>); } else { emit('update:modelValue', v.value ?? ''); } @@ -167,7 +175,7 @@ useInterval(() => { onMounted(() => { nextTick(() => { - if (autofocus.value) { + if (props.autofocus) { focus(); } }); |