egret protobuf生成ts文件报错问题

使用egret protobuf生成ts文件报错问题

首先看白鹭官网提供的demo
egret protobuf
按步骤安装完成后
添加一个test.proto文件,内容如下

package testpackage;

message TestMessage {
    required string testName = 1;
    repeated int32 testNum = 2;
}


目录下执行命令:

pb-egret generate

转出的protobuf-bundles.d.ts文件去掉注释如下

type Long = protobuf.Long;

declare namespace testpackage {
    interface ITestMessage {
        testName: string;
        testNum?: (number[]|null);
    }

    class TestMessage implements ITestMessage {
        constructor(properties?: testpackage.ITestMessage);
        public testName: string;
        public testNum: [ 'Array' ].<number>;
        public static create(properties?: testpackage.ITestMessage): testpackage.TestMessage;
        public static encode(message: testpackage.ITestMessage, writer?: protobuf.Writer): protobuf.Writer;
        public static encodeDelimited(message: testpackage.ITestMessage, writer?: protobuf.Writer): protobuf.Writer;
        public static decode(reader: (protobuf.Reader|Uint8Array), length?: number): testpackage.TestMessage;
        public static decodeDelimited(reader: (protobuf.Reader|Uint8Array)): testpackage.TestMessage;
        public static verify(message: [ 'object' ].<string, any>): (string|null);
    }
}

像这种message: [ 'object' ].和[ 'Array' ]. 都显示有语法问题,后来在
一篇白鹭论坛文章
上看到有人说是node版本太高导致,看了下我的是v12.16.1,把node版本降到v10.21.0解析出来就是正确的message: { [k: string]: any }和number[]

分析下原因:
看了下node_modules@egret\protobuf\src\index.ts中代码,转换成js和ts文件就是下面这两行代码

await shell('pbjs', args);
...
await shell('pbts', ['--main', output, '-o', tempfile]);

找到pbts.js文件,里面callJsdoc函数有如下

 var cmd = "node \"" + require.resolve("jsdoc/jsdoc.js") + "\" -c \"" + path.join(basedir, "lib", "tsd-jsdoc.json") + "\" -q \"module=" + encodeURIComponent(moduleName) + "&comments=" + Boolean(argv.comments) + "\" " + files.map(function(file) { return "\"" + file + "\""; }).join(" ");

果然是通过node命令,猜测下高版本的解释出的类型估计是不兼容现在的写法,关键是网上找了一圈,也没message: [ 'object' ].和[ 'Array' ]. 这种写法。
but,降版本确实可以正确解析出来!

你可能感兴趣的:(egret,js,protobuf)