在使用socket.io
的时候,为了方便复用,便做了Vue插件,然后用provide
和inject
API做全局注入,然后就遇到了类型丢失的问题,在provide
的时候还可以看到类型,但是inject
的时候类型就丢失了
然后查看了Vue3文档,看到了一个InjectionKey
接口: 为了正确地为注入的值标记类型,Vue 提供了一个 InjectionKey 接口,它是一个继承自 Symbol 的泛型类型,可以用来在提供者和消费者之间同步注入值的类型
类型
// SocketInjectKey
import type { InjectionKey } from 'vue'
import type { Socket } from 'socket.io-client'
export const SocketInjectKey: InjectionKey<Socket> = Symbol('socket')
定义
import type { App } from 'vue'
import { io } from 'socket.io-client'
import { SocketInjectKey } from '../types'
interface IO {
connection: string
options: any
}
export default {
install: (app: App, { connection, options }: IO) => {
const socket = io(connection, options)
app.config.globalProperties.$socket = socket
app.provide(SocketInjectKey, socket)
}
}
使用
import { SocketInjectKey } from '../types'
const socket = inject(SocketInjectKey)
socket?.emit('....')