打字稿 - 导入定义的JS类型的怪异行为:



我的头痛试图将自动生成的Java-Script库带入打字稿...

我将Java-Script库和D.TS文件包装到NPM软件包中;并在主机打字条环境中安装了NPM软件包以及打字模块;导入TS文件中的定义类

我有很奇怪的东西:

"发送者"是以下语句中的导入类:

let sender: Sender = <Sender>cont.content(new Sender());

打字稿编译器报告的" TS2304:找不到具有类型定义和铸件的名称"发件人";而" new Sender()"很好。

我在下面发布了代码段,以更好地理解。我摘录了它们以进行清除

JS LIB

/**
 * @constructor
 */
function Exce() { ...}
Exce.getRootAsExce = function(bb, obj) { ...};
Exce.prototype.text = function(optionalEncoding) {...};
...

/**
 * @constructor
 */
function Promp() { ...}
Promp.getRootAsPromp = function(bb, obj) {...};
Promp.prototype.text = function(optionalEncoding) {...};
...
/**
 * @constructor
 */
function Sender() {...}
Sender.getRootAsSender = function(bb, obj) {...};
Sender.prototype.count = function() {...};
...
/**
 * @constructor
 */
function Bucket() {...}
Bucket.getRootAsBucket = function(bb, obj) {...};
Bucket.prototype.content = function(obj) {...};
...
this.Exce = Exce;
this.Promp = Promp;
this.Sender = Sender;
this.Bucket = Bucket;
...

.ts文件(d.ts文件是相同的,并从.ts by tsc命令

获得
    ...
    export interface Buc_S {
        new (): Buc_I;
        (): Buc_I;
        getRootAsBucket (bb:any, obj:any):any;
        ...
    }
    export interface Buc_I {
        contentType ():Post;
        content (obj:any):any;
    }
    export var Bucket: Buc_S;
    export interface Sen_S {
        new (): Sen_I;
        (): Sen_I;
        getRootAsSender (bb:any, obj:any):any;
    }
    export interface Sen_I {
        count(): number;
       ...
    }
    export var Sender: Sen_S;
    export interface Pro_S {
        new (): Pro_I;
        (): Pro_I;
        getRootAsPromp (bb:any, obj:any):any;
    }
    export interface Pro_I {
        text (optionalEncoding: any): any;
    }
    export var Promp: Pro_S;
    export interface Exc_S {
        new (): Exc_I;
        (): Exc_I;
        getRootAsExce (bb:any, obj:any):any;
    }
    export interface Exc_I {
        text (optionalEncoding: any): any;
    }
    export var Exce: Exc_S;

打字稿主机文件

import {TransSender} from "./transSender";
import {Bucket, Post,Sender, Promp,Exce} from "fbsj";
export class Decoder{
    public static extractSender (bucket: string):boolean{
        let abs: Bucket = new Bucket();
        let buf = flatbuffers.ByteBuffer(libbase64.decode(bucket));
        let cont = Bucket.getRootAsBucket(buf, Bucket);
        TransSender._type = cont.contentType();
        if(TransSender._type == Post.Sender){
            let sender: Sender = <Sender>cont.content(new Sender());
            TransSender.setter(sender.count(), sender.pushed(), sender.read(), sender.saved(), sender.rated(), sender.followed(), sender.blocked(), sender.forwarded());
        } else if(TransSender._type == Post.Promp){
            TransSender._prompt = (<Promp>cont(new Promp())).text();
        } else if (TransSender._type == Post.Exce){
            TransSender._exception = (<Exce>cont(new Exce())).text();
        }
    }
}

报告的错误

Error:(24, 18) TS2304: Cannot find name 'Bucket'.
Error:(29, 25) TS2304: Cannot find name 'Sender'.
Error:(29, 35) TS2304: Cannot find name 'Sender'.
Error:(33, 37) TS2304: Cannot find name 'Promp'.
Error:(36, 40) TS2304: Cannot find name 'Exce'.

"帖子"是一个枚举,并且按预期工作。

感谢cdbajorin的评论,

我更改了"发送者"的定义样式(类似于其他...)如下:

export interface Sender {
    new (): Sender;
    (): Sender;
    getRootAsSender (bb:any, obj:any):any;
    count(): number;
   ...
}
export declare let Sender: Sender;

似乎有效,

欢呼

最新更新