Bird
Raised Fist0
Vueframework~20 mins

Typing emits in Vue - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Vue Emits Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What is the emitted event payload type in this Vue component?
Consider this Vue 3 component using defineEmits with TypeScript. What is the type of the payload emitted by the update event?
Vue
const emit = defineEmits<{ (e: 'update', value: number): void }>()

function updateValue() {
  emit('update', 42)
}
AA number value
BAn object with a number property
CA string value
DNo payload
Attempts:
2 left
💡 Hint
Look at the second parameter type in the emit definition.
📝 Syntax
intermediate
2:00remaining
Which option correctly types multiple emits in Vue 3?
You want to type two emits: 'save' with no payload and 'delete' with a string payload. Which defineEmits syntax is correct?
Aconst emit = defineEmits({ save: null, delete: String })
Bconst emit = defineEmits(['save', 'delete'])
Cconst emit = defineEmits<{ save: void; delete: string }>()
Dconst emit = defineEmits<{ (e: 'save'): void; (e: 'delete', id: string): void }>()
Attempts:
2 left
💡 Hint
Use function overload syntax for multiple typed emits.
🔧 Debug
advanced
2:00remaining
Why does this Vue component emit cause a TypeScript error?
This component emits an event 'change' with a string payload, but TypeScript shows an error on emit call. Why?
Vue
const emit = defineEmits<{ (e: 'change', value: number): void }>()

emit('change', 'hello')
AEmits must not have any payload
BThe emitted payload type does not match the defined type
CThe emit function is not called inside setup
DThe event name 'change' is not defined in emits
Attempts:
2 left
💡 Hint
Check the type of the second argument in the emit call.
❓ state_output
advanced
2:00remaining
What is the output when emitting an event with typed emits in Vue 3?
Given this component, what will be logged when trigger is called?
Vue
const emit = defineEmits<{ (e: 'log', message: string): void }>()

function trigger() {
  emit('log', 'Hello Vue')
  console.log('Event emitted')
}

trigger()
ATypeScript error
BNo output
CEvent emitted
DHello Vue
Attempts:
2 left
💡 Hint
Emitting an event does not print anything by itself.
🧠 Conceptual
expert
2:00remaining
Why use defineEmits with TypeScript in Vue 3?
Which is the main benefit of typing emits with defineEmits in Vue 3?
AIt enforces correct event names and payload types at compile time
BIt automatically registers events globally
CIt replaces the need for props in components
DIt enables emitting events without any parameters
Attempts:
2 left
💡 Hint
Think about what TypeScript helps prevent.

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