Help us understand the problem. What is going on with this article?

grpc_tools_node_protoc_tsを使って.protoファイルからTypeScriptの型定義ファイルを生成する

More than 1 year has passed since last update.

概要

grpc-toolsを使って.protoファイルからNode.jsのgRPC clientコードを生成するでは、javascriptのmessage定義とclient実装を自動生成しましたが、今回は、これらのjavascriptに対応する型定義ファイル(.d.ts)を自動生成してみたいと思います。

前提

grpc-toolsを使って.protoファイルからNode.jsのgRPC clientコードを生成する生成するまでを手元で動作させていることが前提です。

また、プロジェクトディレクトリに今回使用するプラグイン grpc_tools_node_protoc_t をインストールしておく必要があります。

npm i --save-dev grpc_tools_node_protoc_ts

型定義ファイルを生成する

次のコマンドを実行して型定義ファイルを生成する。

grpc_tools_node_protoc \
--plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \
--ts_out=. \
hero/hero.proto

生成されるファイルの確認

  • hero_grpc_pb.d.ts
    • hero_grpc_pb.jsに対する型定義ファイル
  • hero_pb.d.ts
    • hero_pb.jsに対する型定義ファイル

おまけ

生成されたjs/.d.tsを使って実際にクライアントコードを動かしてみます。
今回サンプルで使用している.protoファイルのserver実装は sample/04-grpc にあるので、事前にこのリポジトリを取得してserverを立ち上げておきます。

クライアントの実装は次のようになりました。

client.ts
import * as grpc from 'grpc';
import * as hero_grpc_pb from './hero/hero_grpc_pb';
import * as hero_pb from './hero/hero_pb';

const client = new hero_grpc_pb.HeroServiceClient(
  '127.0.0.1:5001',
  grpc.credentials.createInsecure(),
);

const req = new hero_pb.HeroById();
req.setId(1);

client.findOne(req, (error, res) => {
  if (error) {
    console.log(error);
  }
  console.log(res.toObject());
});

実際に実行してみます。

$ ts-node client.ts
{ id: 1, name: 'John' }

参考

daikiojm
Blog: http://daikiojm.hatenablog.com Scrapbox: https://scrapbox.io/daikiojm
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away