【问题标题】:"TS2339: Property 'XX' does not exist on type 'Vue'" when bundling with rollup“TS2339:与汇总捆绑时,类型‘Vue’上不存在属性‘XX’”
【发布时间】:2020-11-11 02:28:51
【问题描述】:

我有一个 Vue/TypeScript 类,它调用另一个 Vue/TypeScript 类的公共方法。它可以使用 tsc 或 WebPack 编译并运行良好。但是当使用 rollup 和 rollup-plugin-vue 进行编译时,我得到一个错误,Property 'close' does not exist on type 'Vue'.

复制链接:https://repl.it/@orobert91/PropertyDoesNotExistOnTypeVue

Popover.vue:

import { Component } from "vue-property-decorator";
import Vue from "vue";

@Component
export default class Popover extends Vue {
    public close() {
        this.isShown = false;
    }
}

DatePicker.vue:

import Popover from "components/commonControls/Popover.vue";
import { Component } from "vue-property-decorator";
import Vue from "vue";

@Component
export default class DatePicker extends Vue {

    public $refs!: {
        popover: Popover
    }

    public get myMethod() {
        this.$refs.popover.close(); //COMPILATION ERROR HERE
    }
}

tsconfig.json 配置文件:

{
    "compilerOptions": {
        "noImplicitAny": true,
        "module": "es6",
        "target": "es6",
        "jsx": "react",
        "jsxFactory": "h",
        "strict": true,
        "experimentalDecorators": true,
        "esModuleInterop": true,
        "moduleResolution": "node",
        "declaration": true,
        "declarationDir": "./dist",
        "baseUrl": "./src",
        "outDir": "./dist",
        "plugins": [
            { "transform": "typescript-transform-paths" },
            { "transform": "typescript-transform-paths", "afterDeclarations": true }
        ]
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "dist"
    ]
}

rollup.config.js 配置文件:

import vue from 'rollup-plugin-vue';
import resolve from 'rollup-plugin-node-resolve';
import cleaner from 'rollup-plugin-cleaner';
import copy from 'rollup-plugin-copy';
import ttypescript from 'ttypescript'
import tsPlugin from 'rollup-plugin-typescript2'

export default {
    input: 'src/index.ts',
    output: {
        format: 'esm',
        file: 'dist/index.js'
    },
    external: ['vue'],
    plugins: [
        resolve(),
        tsPlugin({
            typescript: ttypescript
        }),
        vue(),
        cleaner({
            targets: [
                './dist/'
            ]
        }),
        copy({
            targets: [
              { src: 'src/laravel-mix', dest: 'dist/' },
            ]
        })
    ]
};

【问题讨论】:

    标签: typescript vue.js rollup


    【解决方案1】:

    我认为您可能遇到此问题是因为您没有在您的 Datepicker.vue 组件中注册 Popover 组件

    另外,错误的另一个可能原因可能是您正在使用下面的这个 sn-p 来告诉 typescript 在使用 this.$refs.popover 时不要抛出错误。

     public $refs!: {
       popover: Popover
     }

    也许你的意思是写this.$refs.popover.close()而不是this.popover.close()

    试试这个

    日期选择器.vue

    @Component({
      components: {
        Popover
      }
    })
    export default class DatePicker extends Vue {
    
        public $refs!: {
            popover: Popover
        }
    
        public get myMethod() {
            this.$refs.popover.close(); //using refs to access the DOM directly
        }
    }

    【讨论】:

    • 是的,我的意思是“this.$refs.popover.close()”,这是我帖子中的一个错误,我已经使用完整的复制链接相应地更新了问题。这确实是一个汇总捆绑问题,因为它在使用 tsc 或 WebPack 编译时可以按预期进行编译和工作。该方法被调用并产生预期的结果。
    猜你喜欢
    • 2016-03-14
    • 2017-02-25
    • 2021-11-24
    • 2019-01-11
    • 2021-05-08
    • 2021-10-15
    • 1970-01-01
    • 2020-12-13
    • 2021-08-04
    相关资源
    最近更新 更多