У меня есть плагин Vue3 в js, например:
const myPlugin = {
install(Vue, config) {
// do something
}
export default myPlugin;
Он находится в index.js и будет вызываться app.use. Для проектов TS мне нужно создать объявление типа. Я нашел vue/types/plugin в пакете vue с интерфейсом для объекта и типом для метода установки. Однако я понятия не имею, как применить это к моему плагину. Что должно быть внутри файла d.ts, чтобы компилятор машинописного текста знал, что myPlugin должен иметь тип PluginObject?
Частично да, но не хватает информации о том, как дополнить параметры плагина. Представьте, что у плагина hello есть объект конфигурации, подобный тому, что в моем простом примере выше, как мне увеличить этот объект конфигурации?
Начиная с Vue 3.1.1, App.use()
позволяет аргументу options
быть any
, что, по-видимому, предотвращает увеличение объявления его типа. То есть это расширение модуля не отменяет исходное App.use()
(возможно, потому что any
замещает MyPluginOptions
):
declare module '@vue/runtime-core' {
interface App {
use(plugin: MyPlugin, ...options: MyPluginOptions[]): this;
}
}
Похоже, что единственным текущим обходным решением является непосредственное редактирование node_modules/@vue/runtime-core/dist/runtime-core.d.ts
, добавление универсального к Plugin_2
и PluginInstallFunction
, чтобы можно было вводить аргумент options
:
declare type Plugin_2<Option = any> = PluginInstallFunction<Option> & {
install?: PluginInstallFunction<Option>;
} | {
install: PluginInstallFunction<Option>;
};
export { Plugin_2 as Plugin }
declare type PluginInstallFunction<Option> = (app: App, ...options: Option[]) => any;
А затем замените текущий App.use()
на:
export declare interface App<HostElement = any> {
use<Option>(plugin: Plugin_2<Option>, ...options: Option[]): this;
}
Я также отправил PR на vue-next. Если он будет объединен, вам не понадобится расширение модуля, так как тип options
будет определен автоматически.
Отвечает ли это на ваш вопрос? Вопрос о Vue 3 + TypeScript и дополнении типов для использования с плагинами