表題の機能ってよくあると思うんですが、けっこうめんどくさいんですよね

API 使うの?とかどこから住所引っ張ってくるの?とか

数年前から JS 開発で使っているライブラリあって、便利なんでずっと使っています。

今までは window から生えるメソッド使えばよかったけど今風(?)の書き方じゃないからアプローチしてみた

https://github.com/yubinbango/yubinbango-core

Typescript だと import だったり、型エラー起きるのでその解決方法

(いい方法あったら教えて下さい)

環境

  • Nuxt.js 2.14.7

export されていないから、とりあえず script タグで読み込みます

<script src="[https://yubinbango.github.io/yubinbango-core/yubinbango-core.js](https://yubinbango.github.io/yubinbango-core/yubinbango-core.js)"></script>`

Nuxt.js だと nuxt.config.js でこうですね

head: {
	script: [
	      {
	        src: 'https://yubinbango.github.io/yubinbango-core/yubinbango-core.js'
	      }
	]
...
}

modules.ts

今回使いたい住所が、region, locality, street だけだったので丸めて return しています

interface ZipcodeAddress {
  region: number;
  locality: string;
  street: string;
}
declare global {
  interface Window {
    YubinBango: any;
  }
}
const YubinBango = window.YubinBango || {};
export function fetchAddressByZipcode(
  zipcode: string
): Promise<ZipcodeAddress> {
  return new Promise((resolve) => {
    return new YubinBango.Core(zipcode, (address: ZipcodeAddress) => {
      return resolve(address);
    });
  });
}

呼び出し

<template>
  <div>
		<input v-model="zipcode" type="text" />
		<button @click="handleFetchAddress">住所検索</button>
  </div>
	<p>
		{{ region }}
		{{ locality + street }}
	</p>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
  data() {
		return {
			region: '',
			locality: '',
			street: ''
		}
  },
	methods: {
		async handleFetchAddress() {
			const address = await fetchAddressByZipcode(this.form.zipcode);
			const { region, locality, street } = address;
			this.region = region;
			this.locality = locality;
			this.street = street;
		}
	}
});

</script>

おわり

無理矢理感はあるけど、隠蔽(?)してラッパーみたいな関数を用意しておいたら呼び出しはきれいに書けた