From ec54a0f2f927dc4fb195701d9f466f395ffad7f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Sj=C3=B6=C3=B6h?= Date: Sat, 27 Oct 2018 10:02:39 +0200 Subject: [PATCH] update typescript generation to work in strict mode --- javascript/net/grpc/web/grpc_generator.cc | 18 +++++----- .../examples/echo/ts-example/client.ts | 5 ++- .../examples/echo/ts-example/tsconfig.json | 2 +- packages/grpc-web/index.d.ts | 36 +++++++++++-------- 4 files changed, 34 insertions(+), 27 deletions(-) diff --git a/javascript/net/grpc/web/grpc_generator.cc b/javascript/net/grpc/web/grpc_generator.cc index f30c368db..7551764f4 100644 --- a/javascript/net/grpc/web/grpc_generator.cc +++ b/javascript/net/grpc/web/grpc_generator.cc @@ -369,11 +369,11 @@ void PrintTypescriptFile(Printer* printer, const FileDescriptor* file, printer->Print( "client_: grpcWeb.AbstractClientBase;\n" "hostname_: string;\n" - "credentials_: {};\n" - "options_: { [s: string]: {}; };\n\n" + "credentials_: null | {};\n" + "options_: null | { [s: string]: {}; };\n\n" "constructor (hostname: string,\n" - " credentials: {},\n" - " options: { [s: string]: {}; }) {\n"); + " credentials: null | {},\n" + " options: null | { [s: string]: {}; }) {\n"); printer->Indent(); printer->Print("if (!options) options = {};\n"); if (vars["mode"] == GetModeVar(Mode::GRPCWEB)) { @@ -466,8 +466,8 @@ void PrintGrpcWebDtsFile(Printer* printer, const FileDescriptor* file) { printer->Indent(); printer->Print( "constructor (hostname: string,\n" - " credentials: {},\n" - " options: { [s: string]: {}; });\n\n"); + " credentials: null | {},\n" + " options: null | { [s: string]: {}; });\n\n"); for (int method_index = 0; method_index < service->method_count(); ++method_index) { const MethodDescriptor* method = service->method(method_index); @@ -482,7 +482,8 @@ void PrintGrpcWebDtsFile(Printer* printer, const FileDescriptor* file) { "request: $input_type$,\n" "metadata: grpcWeb.Metadata\n"); printer->Outdent(); - printer->Print("): grpcWeb.ClientReadableStream;\n\n"); + printer->Print(vars, + "): grpcWeb.ClientReadableStream<$output_type$>;\n\n"); } else { printer->Print(vars, "$js_method_name$(\n"); printer->Indent(); @@ -492,7 +493,8 @@ void PrintGrpcWebDtsFile(Printer* printer, const FileDescriptor* file) { "callback: (err: grpcWeb.Error,\n" " response: $output_type$) => void\n"); printer->Outdent(); - printer->Print("): grpcWeb.ClientReadableStream;\n\n"); + printer->Print(vars, + "): grpcWeb.ClientReadableStream<$output_type$>;\n\n"); } } } diff --git a/net/grpc/gateway/examples/echo/ts-example/client.ts b/net/grpc/gateway/examples/echo/ts-example/client.ts index 8ad540866..c22730179 100644 --- a/net/grpc/gateway/examples/echo/ts-example/client.ts +++ b/net/grpc/gateway/examples/echo/ts-example/client.ts @@ -101,9 +101,8 @@ class EchoApp { request.setMessageCount(count); request.setMessageInterval(EchoApp.INTERVAL); - const stream: grpcWeb.ClientReadableStream = - this.echoService_.serverStreamingEcho( - request, {'custom-header-1': 'value1'}); + const stream = this.echoService_.serverStreamingEcho( + request, {'custom-header-1': 'value1'}); const self = this; stream.on('data', (response: ServerStreamingEchoResponse) => { EchoApp.addRightMessage(response.getMessage()); diff --git a/net/grpc/gateway/examples/echo/ts-example/tsconfig.json b/net/grpc/gateway/examples/echo/ts-example/tsconfig.json index b197406ef..81cb22c08 100644 --- a/net/grpc/gateway/examples/echo/ts-example/tsconfig.json +++ b/net/grpc/gateway/examples/echo/ts-example/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "es6", "module": "commonjs", - "noImplicitAny": true, + "strict": true, "allowJs": true, "outDir": "./dist", "types": ["node"], diff --git a/packages/grpc-web/index.d.ts b/packages/grpc-web/index.d.ts index 110408cfc..e5aafee52 100644 --- a/packages/grpc-web/index.d.ts +++ b/packages/grpc-web/index.d.ts @@ -3,31 +3,37 @@ declare module "grpc-web" { export interface Metadata { [s: string]: string; } export namespace AbstractClientBase { - class MethodInfo { - constructor (responseType: {}, - requestSerializeFn: (request: {}) => {}, - responseDeserializeFn: (bytes: {}) => {}); + class MethodInfo { + constructor (responseType: new () => Response, + requestSerializeFn: (request: Request) => {}, + responseDeserializeFn: (bytes: {}) => Response); } } export class AbstractClientBase { - rpcCall (method: string, - request: {}, + rpcCall (method: string, + request: Request, metadata: Metadata, - methodInfo: AbstractClientBase.MethodInfo, - callback: (err: Error, response: {}) => void - ): ClientReadableStream; + methodInfo: AbstractClientBase.MethodInfo, + callback: (err: Error, response: Response) => void + ): ClientReadableStream; serverStreaming (method: string, - request: {}, + request: Request, metadata: Metadata, - methodInfo: AbstractClientBase.MethodInfo - ): ClientReadableStream; + methodInfo: AbstractClientBase.MethodInfo + ): ClientReadableStream; } - export class ClientReadableStream { - on (type: string, - callback: (...args: Array<{}>) => void): ClientReadableStream; + export class ClientReadableStream { + on (type: "error", + callback: (err: Error) => void): ClientReadableStream; + on (type: "status", + callback: (status: Status) => void): ClientReadableStream; + on (type: "data", + callback: (response: Response) => void): ClientReadableStream; + on (type: "end", + callback: () => void): ClientReadableStream; cancel (): void; }