Bird
Raised Fist0
Vueframework~5 mins

Typing emits in Vue

Choose your learning style10 modes available
Introduction

Typing emits helps you tell Vue what events your component can send out. This makes your code safer and easier to understand.

When you create a Vue component that sends events to its parent.
When you want to catch mistakes early by checking event names and data types.
When you work in a team and want clear communication about component events.
When you use TypeScript with Vue to get better code completion and error checking.
Syntax
Vue
defineEmits<{ eventName: (payload: PayloadType) => void }>()
Use defineEmits inside the <script setup> block.
The object keys are event names, and the values are functions describing the payload.
Examples
This defines an event named update that sends a string value.
Vue
const emit = defineEmits<{ update: (value: string) => void }>()
This defines two events: close with no data, and select with a number.
Vue
const emit = defineEmits<{ close: () => void; select: (id: number) => void }>()
This defines events without payload types, just their names.
Vue
const emit = defineEmits(['open', 'save'])
Sample Program

This Vue component defines a submit event that sends a string. When the button is clicked, it emits the event with the name 'Alice'.

Vue
<script setup lang="ts">
const emit = defineEmits<{ submit: (name: string) => void }>()

function sendName() {
  emit('submit', 'Alice')
}
</script>

<template>
  <button @click="sendName">Send Name</button>
</template>
OutputSuccess
Important Notes

Typing emits helps catch errors if you try to emit an event that is not defined or with wrong data.

You can use both string array or object syntax, but object syntax gives better type safety.

Summary

Typing emits tell Vue what events your component can send.

This improves code safety and helps tools give better suggestions.

Use defineEmits inside <script setup> with event names and payload types.

Practice

(1/5)
1. What is the main purpose of using defineEmits in a Vue component?
easy
A. To declare which events the component can emit and their payload types
B. To define the component's reactive state variables
C. To register global Vue plugins
D. To import external libraries into the component

Solution

  1. Step 1: Understand the role of defineEmits

    defineEmits is used inside <script setup> to specify which events a component can send out.

  2. Step 2: Identify what it declares

    It declares event names and their payload types to improve type safety and tooling support.

  3. Final Answer:

    To declare which events the component can emit and their payload types -> Option A
  4. Quick Check:

    Typing emits = declare events and payloads [OK]
Hint: defineEmits declares events your component can send [OK]
Common Mistakes:
  • Confusing defineEmits with state or props
  • Thinking it registers plugins
  • Using it to import libraries
2. Which of the following is the correct syntax to type an emit event named submit with a payload of type string in Vue 3 <script setup>?
easy
A. const emit = defineEmits(['submit: string'])
B. const emit = defineEmits({ submit: string })
C. const emit = defineEmits('submit', string)
D. const emit = defineEmits<{ submit: (payload: string) => void }>()

Solution

  1. Step 1: Recall the correct typing syntax for emits

    Vue 3 uses defineEmits with a TypeScript type object describing event names and their payload function signatures.
  2. Step 2: Match the correct syntax

    The correct syntax is defineEmits<{ submit: (payload: string) => void }>() which types the submit event with a string payload.
  3. Final Answer:

    const emit = defineEmits<{ submit: (payload: string) => void }>() -> Option D
  4. Quick Check:

    Typed emits use object with event function signatures [OK]
Hint: Use defineEmits with typed event function signatures [OK]
Common Mistakes:
  • Passing event and type as separate arguments
  • Using array with type inside string
  • Using object with type directly instead of function signature
3. Given this Vue <script setup> code:
const emit = defineEmits<{ update: (value: number) => void }>();

emit('update', 42);

What will happen if you try to emit update with a string payload like emit('update', 'hello')?
medium
A. Vue will throw a runtime error when emitting
B. TypeScript will show an error because the payload type is incorrect
C. The event will emit successfully with the string payload
D. The event will be ignored silently

Solution

  1. Step 1: Understand the typed emit signature

    The update event expects a payload of type number as declared in defineEmits<{ update: (value: number) => void }>().
  2. Step 2: Check what happens if payload type mismatches

    Passing a string like 'hello' violates the type signature, so TypeScript will report a compile-time error before running.
  3. Final Answer:

    TypeScript will show an error because the payload type is incorrect -> Option B
  4. Quick Check:

    Typed emits enforce payload types at compile time [OK]
Hint: Typed emits catch wrong payload types before runtime [OK]
Common Mistakes:
  • Thinking Vue throws runtime error instead of TS error
  • Assuming event emits anyway without error
  • Confusing payload type with event name
4. Identify the error in this Vue <script setup> code snippet:
const emit = defineEmits<{ save: (data: object) => void }>();

emit('save');
medium
A. Missing payload argument when emitting 'save' event
B. Incorrect event name 'save' should be 'Save'
C. defineEmits should not use type annotations
D. emit function is not defined

Solution

  1. Step 1: Check the typed emit signature

    The save event expects a payload argument of type object.
  2. Step 2: Analyze the emit call

    The call emit('save') is missing the required payload argument, causing a type error.
  3. Final Answer:

    Missing payload argument when emitting 'save' event -> Option A
  4. Quick Check:

    Typed emits require payloads as declared [OK]
Hint: Emit calls must include all typed payload arguments [OK]
Common Mistakes:
  • Omitting required payload argument
  • Using wrong event name casing
  • Thinking type annotations are invalid here
5. You want to type a Vue component emit that can send either a string or number payload with the event name change. Which is the correct way to type this using defineEmits?
hard
A. const emit = defineEmits<{ change: (value: string & number) => void }>()
B. const emit = defineEmits<{ change: (value: string) => void; change: (value: number) => void }>()
C. const emit = defineEmits<{ change: (value: string | number) => void }>()
D. const emit = defineEmits<{ change: (value: any) => void }>()

Solution

  1. Step 1: Understand union types for payloads

    To allow multiple types for a payload, use a union type with |, e.g., string | number.
  2. Step 2: Check the options for correct union usage

    const emit = defineEmits<{ change: (value: string | number) => void }>() correctly types the change event with a payload that can be either string or number.
  3. Step 3: Identify incorrect options

    const emit = defineEmits<{ change: (value: string) => void; change: (value: number) => void }>() repeats the same event name twice, which is invalid. const emit = defineEmits<{ change: (value: string & number) => void }>() uses intersection & which means both types simultaneously (impossible). const emit = defineEmits<{ change: (value: any) => void }>() uses any which loses type safety.
  4. Final Answer:

    const emit = defineEmits<{ change: (value: string | number) => void }>() -> Option C
  5. Quick Check:

    Use union types for multiple payload types [OK]
Hint: Use | to combine payload types in defineEmits [OK]
Common Mistakes:
  • Repeating event names in type object
  • Using & instead of | for union types
  • Using any which disables type safety
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard