Vuejs+TypeScriptのプロジェクトで、非TSなVueコンポーネント内のメソッドを呼び出す
やりたいこと
TypeScriptで書かれたclassベースのVueコンポ―ネントから、JavaScriptで書かれたVueコンポーネント内のmethodsを呼び出したい。
悩んだこと
外部からimportしたパッケージ内のVueコンポーネントはJavaScriptかつ型の定義なしで、自分のプロジェクトはTypeScriptを使用していた。
this.$refs.child.method()
でアクセスしようとすると、does not exist
と言われてしまう。
解決法
呼び出し元のコンポーネント内でInterfaceを定義し、
型アサーション( https://typescript-jp.gitbook.io/deep-dive/type-system/type-assertion )を使用してthis.$refs.child as HogeInterface
と書く。
具体例
いい感じのカラーピッカーを提供してくれる下記のパッケージをTypeScriptで書かれたVueコンポーネントにimportして使用する。
vue-swatches : https://saintplay.github.io/vue-swatches/
このパッケージに含まれるVSwatchesコンポーネント内のgetAlwaysOnScreenStyleメソッドを呼び出す。
<template>
<div>
<v-swatches ref="child"></v-swatches>
</div>
</template>
<script lang="ts">
import VSwatches from "vue-swatches";
import { Vue, Component, Prop } from "vue-property-decorator";
import "vue-swatches/dist/vue-swatches.css";
// Interfaceを定義
interface IVSwatches extends Vue {
// 呼び出したいメソッドを書いてあげる
getAlwaysOnScreenStyle(): any;
}
@Component({
components: {
VSwatches,
},
})
export default class Parent extends Vue {
// --(略)--
// 型アサーションをつかい、型をつけて子要素を取得するだけのメソッドを定義する
public hoge(): IVSwatches {
return this.$refs.child as IVSwatches;
}
// 上記のメソッドから子要素を取得して、Interfaceで定義したメソッドを呼び出す
public hoge2(): void {
const ho = this.hoge().getAlwaysOnScreenStyle();
// --(略)--
}
}
</script>
その他
d.tsを作るのもよい?
でも特定のコンポーネントでしか使わないならこっちで十分だと思う。
Author And Source
この問題について(Vuejs+TypeScriptのプロジェクトで、非TSなVueコンポーネント内のメソッドを呼び出す), 我々は、より多くの情報をここで見つけました https://qiita.com/acucumber/items/08524d47d9cdc7fbac53著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .