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を作るのもよい?
でも特定のコンポーネントでしか使わないならこっちで十分だと思う。