Bird
Raised Fist0
Vueframework~10 mins

Typing emits in Vue - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to define an emit event named 'update' in a Vue component.

Vue
const emit = defineEmits<{ [1]: (value: string) => void }>()
Drag options to blanks, or click blank then click option'
A"update"
B"click"
C"submit"
D"change"
Attempts:
3 left
💡 Hint
Common Mistakes
Using an event name that does not match the intended emit event.
Forgetting to put the event name in quotes.
2fill in blank
medium

Complete the code to type an emit event 'submit' that sends a number payload.

Vue
const emit = defineEmits<{ [1]: (id: number) => void }>()
Drag options to blanks, or click blank then click option'
A"input"
B"update"
C"click"
D"submit"
Attempts:
3 left
💡 Hint
Common Mistakes
Using the wrong event name string.
Not matching the event name with the expected payload.
3fill in blank
hard

Fix the error in typing the emit event 'close' that sends no payload.

Vue
const emit = defineEmits<{ [1]: () => void }>()
Drag options to blanks, or click blank then click option'
A"toggle"
B"open"
C"close"
D"click"
Attempts:
3 left
💡 Hint
Common Mistakes
Using a different event name than intended.
Confusing event names with similar meanings.
4fill in blank
hard

Fill both blanks to type emits 'change' with a string payload and 'delete' with a number payload.

Vue
const emit = defineEmits<{ [1]: (value: string) => void; [2]: (id: number) => void }>()
Drag options to blanks, or click blank then click option'
A"change"
B"update"
C"delete"
D"remove"
Attempts:
3 left
💡 Hint
Common Mistakes
Swapping event names and payload types.
Using incorrect event names.
5fill in blank
hard

Fill all three blanks to type emits: 'input' with a string, 'submit' with a number, and 'cancel' with no payload.

Vue
const emit = defineEmits<{ [1]: (text: string) => void; [2]: (id: number) => void; [3]: () => void }>()
Drag options to blanks, or click blank then click option'
A"cancel"
B"submit"
C"input"
D"close"
Attempts:
3 left
💡 Hint
Common Mistakes
Mixing up event names and payload types.
Using wrong event names.

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