summaryrefslogtreecommitdiff
path: root/packages/frontend/src/components/MkInput.vue
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2025-08-31 19:53:38 +0900
committerGitHub <noreply@github.com>2025-08-31 19:53:38 +0900
commitc95092903a37159aa73073e31519ed363ed404b7 (patch)
treec49e0b7a03202d17a49d05020793f4652f65af6e /packages/frontend/src/components/MkInput.vue
parent[skip ci] Update CHANGELOG.md (prepend template) (diff)
downloadmisskey-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.vue26
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();
}
});