Странное поведение Typescript для импортированных определенных типов JS:

У меня головные боли, пытаясь перенести автоматически сгенерированную библиотеку java-скриптов в машинописный текст ...

Я упаковал библиотеку java-скриптов и файл d.ts в пакет npm; и установил пакет npm и модули набора текста в среде машинописного текста хоста; импортировал определенные классы в файл ts

У меня есть кое-что очень странное:

"Sender" - это импортированный класс в следующем утверждении:

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

компилятор машинописного текста сообщил: «TS2304: не удается найти имя« Отправитель »с определением типа и приведением типа; тогда как« новый отправитель () »в порядке.

Для лучшего понимания я разместил нижеприведенные фрагменты кода. Я выписал их для оформления

библиотека js

/**
 * @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 командой 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'.

«Сообщение» - это перечисление, и оно работало должным образом.


person George Wang    schedule 22.06.2016    source источник
comment
кстати, первая ошибка в Bucket была вызвана выражением let abs: Bucket = new Bucket ();   -  person George Wang    schedule 22.06.2016
comment
У вас нет типа Sender. У вас есть переменная Sender типа Sen_S. Что касается автоматически сгенерированного java-скрипта. Что это значит? Вы написали это на машинописном тексте и сгенерировали javascript? Если да, то почему у вас есть интерфейсы, представляющие классы?   -  person chrisbajorin    schedule 22.06.2016
comment
на ваш вопрос, автоматически сгенерированный js, на самом деле это плоский буфер, который является двоичным протоколом связи, который принимает схему и выдает библиотеку кода на разных языках, из которых js является одним из них. к сожалению, в данный момент ts не поддерживается   -  person George Wang    schedule 23.06.2016


Ответы (1)


благодаря комментарию cdbajorin,

Я изменил стиль определения «Отправитель» (аналогичный другим ...) следующим образом:

export interface Sender {
    new (): Sender;
    (): Sender;

    getRootAsSender (bb:any, obj:any):any;

    count(): number;
   ...
}
export declare let Sender: Sender;

и вроде работает,

ваше здоровье

person George Wang    schedule 23.06.2016