VScodeで入力補完をフル活用するプラグインの書き方

小ネタレベルです。
#RPGMakerMV Intellisenseを使う
下記のURLからダウンロードしてください。

http://endlessillusoft.com/rpgmakermv-intellisense/

1．rmmv-pixi.d.tsをDLする（上から2番目）
2．jsconfig.jsonをDLする（上から3番目）

この2つのファイルを、「js\plugins」フォルダに入れます。
ダウンロードしたものを、プラグインの制作に使っているjsフォルダにコピーします。
その後、VSCodeを起動し、以下のように設定します。
「ファイル→フォルダーを開く→先ほどファイルをコピーしたフォルダの一つ手前のフォルダを選択（要するにプロジェクトのルートディレクトリ）」

[公式フォーラム](
https://forum.tkool.jp/index.php?threads/%E3%83%84%E3%82%AF%E3%83%BC%E3%83%ABmv%E9%96%A2%E9%80%A3%E3%81%AE%E6%8A%80%E8%A1%93%E7%B3%BB%E3%81%AE%E8%A8%98%E4%BA%8B%E5%85%B1%E6%9C%89.47/#post-2097)にてこの件について転載の許可をいただいたツミオ様にここでお礼申し上げます。
#JavaDocを有効利用する。

JavaDocとは関数やクラスの情報をエディタなどに伝えるためにある記述です。
これは私の作ったプラグインの一つで使われているコードから抜粋したものです。
こうすることで、この関数内ではitemメンバが補完され、戻り値を利用する関数でもアクターの配列として利用できます。

```js:Mano_ItemPocket.js
/**
 * @param {RPG.Item} item
 * @return {Game_Actor[]}
 */
Scene_ItemPocket.prototype.makeItemTargets =function(item){
    if(this.itemScopeForAll(item) ){
        return this.allMembers();
    }
    const index = this._actorWindow.index();
    if(index>=0){
        return [$gameParty.members()[index]];
    }
    return [];
};
```

ある程度大きいプラグインではこの入力補完の威力は大きいです。
積極的に使いましょう。
他の人が改造するときの補助にもなります。

#プラグインパラメータを一括で初期化する
```js:Mano_ItemPocket.js
    const xxx={
        maxAmount : Number (param.maxAmount),
        weight:Number(param.defaultWeight),
        canDuplicate:Boolean(param.canDuplicate==='true'),
        pocketSize :Number(param.pocketSize),

        menuCommandPostion :Number(param.menuCommandPosition),

        usingMyset:Boolean(param.usingMyset==='true'),
        usingWeight:Boolean(param.usingWeight==='true'),
        mysetSize :Number(param.mysetSize ||8),
        mysetFormat:String(param.mysetFormat),
        saveMyset:String(param.saveMyset),
        loadMyset:String(param.loadMyset),
        renameMyset:String(param.renameMyset),
        weightText:String(param.weightText),

        commandKey :"actorItemEquip",
        commandName:String(param.menuCommand),

        wordUse:String(param.CommandUse),
        symbolUse:'use',
        wordSwap:String(param.CommandSwap),
        symbolSwap:'swap',
        wordRemove:String(param.CommandRemove),
        symbolRemove:'remove',
        wordAdd:String(param.CommandAdd),
        symbolAdd:'add',
        wordMyset:String(param.CommandMyset),
        symbolMyset:'myset',
        wordPass:String(param.CommandPass),
        symbolPass:'pass',

        wordSort:'整列',
        symbolSort:'sort',
        symbolOutOfWindow :'outwindow',
        symbolNon:'non',
        pocketWindow:{
            w:function(){return Graphics.boxWidth/2;},
            h:function(){return 240;},
            smallH:function(){return 240;}
        },
        color:{
            max:Number(param.MaxColor) || 18,
        },
        tag:{
            maxAmount:'MaxAmount',
            weight:'Weight'
        },
    };
```

この書き方だとxxx.と書いた時点でメンバの候補が出てきます。
定義する際にクラスのコンストラクタを呼び出しているため、型情報がちゃんと残ります。
これもまた、プラグインを改造するときに役に立ちます。

もう一つ説明しておきたいのがBoolean(param.hoge==='true')パターンです。
これはhogeという名前のプラグインパラメータがあったとして、hogeがundefinede・文字列・'false'のどれであったとしても正しく機能します。
プラグインを更新したときにプラグインパラメータが不正で予期せぬ動作を起こすパターンを回避できます。

また、プラグインパラメータが構造体である場合、生成用の関数を挟むことで型指定が可能です。
適当にfunction createParam()などと書いて、戻り値で自分に都合のいいオブジェクトを返すようにします。

#まとめ
以上の3点です。
プラグインの書き方は人による差が大きいです。
自分にあった書き方を見つけましょう。