vue-typed-emit

TypeScript utility type for Vue.js $emit
36,856 20
Install
npm install vue-typed-emit
Latest Version:1.2.0
Vue:1 · 2
License:MIT
Last Updated:Feb 4, 2025
Links: GitHub  ·  npm
Maintainer: 3vil_arthas

vue-typed-emit

TypeScript utility type for Vue.js $emit

BuildStatus Version Bundle Size Codacy Badge Downloads LastCommit License

❗ This library is intended to be used with Vue <3. Vue 3 provided a way to type emits.

Installation

Via NPM

$ npm i vue-typed-emit -D

Via Yarn

$ yarn add vue-typed-emit --dev

Usage

Options API

import Vue from 'vue'
// import type { WithEvents } from 'vue-typed-emit' TypeScript 3.8+
import { WithEvents } from 'vue-typed-emit'

interface Events {
  foo: string
  bar: [string, number]
  baz: undefined
}

export default (Vue as WithEvents<Events>).extend({
  name: 'Component',
  methods: {
    method() {
      this.$emit('foo', 'foo')
      this.$emit('bar', 0)
      this.$emit('baz')
    },
  },
})
// YourAwesomeExtendedComponent.vue
// ...

export default Vue.extend({
  // ...
  methods: {
    baz() {},
  },
  // ...
})
// ...
import YourAwesomeExtendedComponent from 'path/to/your/awewsome/extended/component'

export default (
  YourAwesomeExtendedComponent as WithEvents<
    WithEvents,
    typeof YourAwesomeExtendedComponent
  >
).extend({})

Composition API

import { SetupContext, defineComponent } from '@vue/composition-api'
// import type { CompositionAPIEmit } from 'vue-typed-emit' TypeScript 3.8+
import { CompositionAPIEmit } from 'vue-typed-emit'

interface Events {
  foo: string
  bar: [string, number]
  baz: undefined
}

interface ExtendedSetupContext extends SetupContext {
  emit: CompositionAPIEmit<Events>
}

export default defineComponent({
  name: 'Component',
  setup(props, { emit }: ExtendedSetupContext) {
    emit('foo', 'foo')
    emit('bar', 0)
    emit('baz')
  },
})

Motivation

If your project is written using TypeScript + Vue.js, likely your components have some "contracts" – props they receive and events they emit. vue-typed-emit is aimed to ensure that your components adhere to the contract they claimed when it comes to events emitting and corresponding payloads.

Caveats

Array payload

If event payload is type of of Array it should be defined this way.

interface Events {
  foo: [string[]]
}

Tests

npm run test

Build

npm run build

License

MIT

Related Packages

@mr-hope/vuepress-types

VuePress TypeScript helpers

22,182 2,536
vuepress-types

VuePress TypeScript helpers

8,406 82
vuepress-typings

VuePress TypeScript helpers

2,174 2,536
@mdit-vue/types

Shared types definition of mdit-vue

6,739,381 221
@intlayer/types

Retrieve Intlayer configurations and manage environment variables for both serve...

741,980 856

Version History

Version Released License
1.2.0 MIT
1.1.1 MIT
1.1.0 MIT
1.0.0 MIT