Bird
Raised Fist0
Vueframework~15 mins

Typing emits in Vue - Mini Project: Build & Apply

Choose your learning style10 modes available
Typing emits in Vue 3
📖 Scenario: You are building a simple Vue 3 component that emits a typed event when a button is clicked. This helps other components know exactly what data to expect from the event.
🎯 Goal: Create a Vue 3 component that emits a typed event called update with a string payload when a button is clicked.
📋 What You'll Learn
Create a Vue 3 component using the <script setup> syntax
Define the emits option with a typed update event that accepts a string
Add a button that triggers the update event with a specific string payload
Use TypeScript to ensure the event payload is typed correctly
💡 Why This Matters
🌍 Real World
Typed emits help Vue developers build components that communicate clearly and safely, reducing bugs caused by unexpected event data.
💼 Career
Understanding typed emits is important for Vue developers working on scalable applications where components need strict contracts for events.
Progress0 / 4 steps
1
Create the Vue component skeleton
Create a Vue 3 component file with <script setup lang="ts"> and an empty template section.
Vue
Hint

Start by creating the basic structure of a Vue 3 component using the <script setup> syntax with TypeScript.

2
Define the typed emits option
Inside the <script setup lang="ts">, define a constant called emit using defineEmits with an event named update that accepts a string payload.
Vue
Hint

Use defineEmits with a TypeScript type that specifies the event name and the payload type.

3
Add a button that emits the event
In the <template>, add a <button> element with a click event handler that calls emit('update', 'Hello Vue').
Vue
Hint

Use the @click directive on the button to call the emit function with the correct event name and string.

4
Complete the component with proper typing
Ensure the component uses defineEmits with the typed update event and the button emits the event with the string 'Hello Vue'. The component should be fully typed and ready to use.
Vue
Hint

Check that the emits typing and button click event are correctly implemented and match exactly.

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