概要
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.prototype
にgetWeek
を代入してやります。
type Week = "日" | "月" | "火" | "水" | "木" | "金" | "土"
const WEEKS: Array<Week> = ["日", "月", "火", "水", "木", "金", "土"]
Date.prototype.getWeek = function() {
return WEEKS[this.getDay()]
}
これでスプレッドシートのGAS書くときに多少は楽できるかなーって思います
余談
てかGASでもモンキーパッチできるんだね🤔