🎃

【Vue3】TypeScriptでwindow.googleと記述した際のエラーを解消する

1 min read

Vue、TypeScriptを利用してGoogleMapを表示する際に、window.googleと記述した際に以下のエラーが発生したときの対処法

プロパティ 'google' は型 'Window & typeof globalThis' に存在しません。ts(2339)

この記事では、Vueを例に書いていますが、他のフレームワークでも同様に使える手法です。

結論

<template>
  省略
</template>

<script lang="ts">
import { defineComponent } from 'vue';

interface GMapWindow extends Window {
  google: any;
}
declare const window: GMapWindow;

export default defineComponent({
  setup() {
    new window.google.maps.Map(GoogleMapを表示するHTMLのref, {
    ・・・

解説

TypeScriptで次のように記述すると、windowgoogleというプロパティはないと怒られる。

window.google.maps

そのため、windowgoogleというプロパティを持っていることを宣言することによって、上記エラーを回避する。

1. Windowを継承したインターフェースを定義する

もともと定義されているinterface Windowを継承して新たなinterfaceを作成し、googleというプロパティを持っていることを宣言する。

説明簡略化のためにanyを指定していますが、より厳密に型チェックを行いたい場合は、googleが持つ各プロパティを定義しましょう。

<template>
  省略
</template>

<script lang="ts">
import { defineComponent } from 'vue';

+ interface GMapWindow extends Window {
+   google: any;
+ }

export default defineComponent({
  setup() {
    new window.google.maps.Map(GoogleMapを表示するHTMLのref, {
    ・・・

2. アンビエント宣言でWindowの型定義をする

declareキーワードでwindowの型を上書きする。
以下のようにすることで、windowの型は先ほど定義したGMapWindowとして認識される。

<template>
  省略
</template>

<script lang="ts">
import { defineComponent } from 'vue';

interface GMapWindow extends Window {
  google: any;
}
+ declare const window: GMapWindow;

export default defineComponent({
  setup() {
    new window.google.maps.Map(GoogleMapを表示するHTMLのref, {
    ・・・

declareについて詳しく知りたい方はこちら

これでwindow.googleと記述してもエラーが表示されなくなります。

Discussion

ログインするとコメントできます