Solana Anchorで「'payer' does not exist on type 'Wallet'」警告の対応

Anchorでテストコードを作るときに、Fee Payerをセットする場合はKeypairとなる「provider.wallet.payer」を利用することが多い。

経緯

サンプルプログラムどおりに実装する分には問題ないが、TypeScriptでprovider設定してから「provider.wallet.payer」を使うと、VSCodeで「そのプロパティは存在しないよ」という警告が表示される。
AnchorのDiscordやGitHub Issueを見ても、解決策が乗っておらず、やむを得ず強引に無視する実装にしたため、そのときのメモ。
あくまでテストコードなので本対応でも特に問題はない想定。

現象

VSCodeで以下の警告が表示される。

Property 'payer' does not exist on type 'Wallet'.ts(2339)

テストコード(該当箇所のみ):


const anchorProvider = anchor.AnchorProvider.env(); const rpc = anchorProvider.connection.rpcEndpoint; // e.g. http://localhost:8899 const connection = new Connection(rpc, 'confirmed'); if (!process.env.SECRET_KEY) throw Error('Not found SECRET_KEY'); const secretKey = new Uint8Array(JSON.parse(process.env.SECRET_KEY)); const keypair = Keypair.fromSecretKey(secretKey); const wallet = new anchor.Wallet(keypair); const provider = new anchor.AnchorProvider( connection, wallet, { commitment: 'confirmed' }, ); anchor.setProvider(provider); const program = anchor.workspace.Hok; 〜〜〜省略〜〜〜 const signature = await sendAndConfirmTransaction( provider.connection, transaction, [provider.wallet.payer], // ← 「Property 'payer' does not exist on type 'Wallet'.ts(2339)」エラー );

原因

provider.wallet.payer の型が認識されていないため。

対応

「//@ts-ignore」で無視することもできるが、宣言時にproviderにanyを追記することもで逃げることができるため、今回はanyを記述。
「provider: any」と記述する。

  const provider: any = new anchor.AnchorProvider(
    connection, wallet, { commitment: 'confirmed' },
  );
  anchor.setProvider(provider);

補足

型チェックが厳密な必要なコードではanyの利用のご法度だが(TypeScriptを使う意味がなくなってしまうため)、今回のエラー箇所はあくまでテスト専用に利用する部分のため、暫定的に利用。
なお、GitHubでみんなの実装を見てみると、「//@ts-ignore」で無視させてるケースが多かった。