LoginSignup
1
1

More than 5 years have passed since last update.

TypeScriptでDate型に曜日を返すメソッドを追加した with GAS

Posted at

概要

clasp使ってGASをtsで書いていたのですが、Date型に日本語の曜日を返却するメソッドがなかったので、拡張メソッド(厳密にはモンキーパッチ)で実装してみました

そもそも拡張メソッド(モンキーパッチ)とは?

拡張メソッドはC#、Swift、Kotlinなどで使える、既存のクラスのメソッドを拡張する機能です。内部的にはstaticメソッドとしてコンパイルされます。

モンキーパッチも既存のクラスのメソッドを拡張するという意味では変わりませんが、クラス(jsの場合はprototype)に直接メソッドを追加している点が違います。

Effective JavaScriptにやみくもなモンキーパッチを避けると書いてあったので使うのを避けていましたが、今回はほぼ趣味で書いてるようなもんだし規模が小さいし別にいいかな…って思ったので実装してみました

実装

type Week = "" | "" | "" | "" | "" | "" | ""

const WEEKS: Array<Week> = ["", "", "", "", "", "", ""]

interface Date {
  getWeek(): Week
}

Date.prototype.getWeek = function() {
  return WEEKS[this.getDay()]
}

jsならば以下で動きます

const WEEKS = ["", "", "", "", "", "", ""]

Date.prototype.getWeek = function() {
  return WEEKS[this.getDay()]
}

解説

以下のように、既存のクラスをinterfaceとして書くことで、クラスにメソッドの情報を登録することができます。


interface Date {
  getWeek(): Week
}

ただしこの状態だとjsとしての実装がないため、Date.prototypegetWeekを代入してやります。

type Week = "" | "" | "" | "" | "" | "" | ""

const WEEKS: Array<Week> = ["", "", "", "", "", "", ""]

Date.prototype.getWeek = function() {
  return WEEKS[this.getDay()]
}

これでスプレッドシートのGAS書くときに多少は楽できるかなーって思います

余談

てかGASでもモンキーパッチできるんだね🤔

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1