Файл объявления Vue3 Typescript

У меня есть плагин 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?

Отвечает ли это на ваш вопрос? Вопрос о Vue 3 + TypeScript и дополнении типов для использования с плагинами

ethan_you 15.02.2021 07:10

Частично да, но не хватает информации о том, как дополнить параметры плагина. Представьте, что у плагина hello есть объект конфигурации, подобный тому, что в моем простом примере выше, как мне увеличить этот объект конфигурации?

Stiegi 15.06.2021 11:43
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
2
1 477
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Начиная с 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 будет определен автоматически.

Другие вопросы по теме