ンンンパ

食べ物では丸焼きに興味があります

TypeScriptでmixinした時に型情報が見れないのをある程度なんとかする。

わたしが使っているのはこういうやつで、"Real" Mixins with JavaScript Classes由来のやつです。

gist.github.com

このようにインします。

export default class Mixed extends (mix(BaseClass).mix(
  Mix1,
  Mix2,
  Mix3
) as typeof BaseClass) {
  // class
}

これだとget/setがいける、順番を気にしなくていい、extendsに書ける、など結構いい感じで好きです。(prototype方式だとget/setで死んだような)

しかしクラスを動的に作る方式なので、クラスをインターフェースとしてimplementsに入れることができず、IDEの支援が半減してつらい。

そこで、入れられる側の引数であるsuperclassはtypeof Hogeですよと教えると、とりあえず入れられる側で設定しているプロパティにはアクセスできます。

export let Mix1 = (superclass: typeof Mixed) => class extends superclass {
}

これだと入れられる側の平行アクセスが出来ないとか、外側から入れられたメソッドなどの情報が見れないので警告が出るとか色々ありますけど、まぁ小マシになります。