了解です!
ではリクエストどおり、少し飛んで コラム: よくある落とし穴とその回避策「emitの型不一致」 を書きます。
Composition API の defineEmits
を使うと型安全に emit
ができるはずなのに、
次のような問題が起きがちです。
<!-- ParentComponent.vue -->
<ChildComponent :count="count" @increment="incrementCount" />
<!-- ChildComponent.vue -->
<script lang="ts" setup>
interface Props {
count: number;
}
const props = defineProps<Props>();
const emit = defineEmits<{
(event: 'increment', payload: number): void;
}>();
// payloadを渡す想定なのに…
function increment() {
emit('increment'); // ❌ payload が足りない → 型エラー(またはランタイムエラー)
}
</script>
emit('increment')
なのに payload: number
が必須問題点 | 説明 |
---|---|
定義と使い方がズレる | defineEmits で payloadあり → でも実際は渡していない |
イベント名は合っている | でも引数の個数・型が合っていない |
TypeScript が補完してくれない | 型定義を省略した場合に発生 |
defineEmits
に正しい型を定義する