Weboldal keresés

javascript - (TypeScript) Típusdefiníció létrehozása a Parse SDK-hoz (Böngésző és Node)


Typescript típusdefiníciót készítek a Parse Javascript SDK-hoz. Valójában teljes. A definíció működne a Browse és a Cloud Code esetén, de Node-ban nem.

Parse használata mind kliens oldali, mind szerver oldali JavaScript-tel

Példa böngészése:

var GameScore = Parse.Object.extend("GameScore");

Csomópont példa:

var Parse = require('parse').Parse;
var GameScore = Parse.Object.extend("GameScore"); 

Pseudotípus definíció

declare module Parse {

    interface FacebookUtils {
        init(options?: any);
    }

    class Object {
        constructor(attributes?: any, options?: any);

    }

    module Cloud {

        interface FunctionResponse {
            success?: (response: HttpResponse) => void;
            error?: (response: HttpResponse) => void;
        }
    }

}

declare module "parse" {
    export = Parse;
}

Parse használata újonnan létrehozott definícióval

class GameScore extends Parse.Object {}

var gameScore = new GameScore();

Minden rendben működne a Browse részben, mert a Parse könyvtár globálisan elérhető.

Most a Node-ban minden jól működne, ha az import így lenne:

var Parse = require("parse"); 

De az import valójában így néz ki:

var Parse = require("parse").Parse;

Tehát a ".Parse" az import végén problémát okozna, amikor megpróbálnánk hozzáférni a Parse.Object-hez, mert a fenti definícióban nincs elérési út a ".Parse"-hoz.

Szóval amit csinálni akarok, az az, hogy legyen egyetlen definíciós fájlom, ami mind a Böngésző, mind a Node számára működik. Gondolkodtam azon, hogy használjak egy interfészt, de nem hiszem, hogy az lehetővé tenné számomra az extends vagy implements használatát, amikor akarom.

Például:

declare module Parse {

    ...

    interface Parse {
        Object: Object;
    }
}

declare module "parse" {
        export = Parse;
}

Ez nem engedné, hogy kiterjesszem az Object-et, csak egy tulajdonságként van definiálva a Parse felületen.

Bármilyen segítség nagyszerű lenne. Köszönöm.

Válasz #1

Ez kicsit bonyolult :

declare module Parse {

    interface FacebookUtils {
        init(options?: any);
    }

    class Object {
        constructor(attributes?: any, options?: any);

    }

    module Cloud {

        interface FunctionResponse {
            success?: (response: HttpResponse) => void;
            error?: (response: HttpResponse) => void;
        }
    }

}

declare module "parse" {
    var captureType: typeof Parse;
    var subType: {
        Parse: typeof captureType;
    }
    export = subType;
}

Használat :

///<reference path="parse.d.ts"/>

import parse = require('parse');
var Parse = parse.Parse;

Magyarázat

Ahhoz, hogy hivatkozz a modul típusára, a typeof-ra van szükséged. Ezt tudva, a következőt szeretnéd megtenni, de nyilvánvaló okokból nem tudod (melyik Parse ez? ... a globális? vagy a helyi?):

var Parse: { Parse: typeof Parse }
export = Parse;

Ezért a helyi típusok szóbelisége. Ne aggódj, semmilyen módon nem növelik a generált JavaScript méretét.

Kapcsolódó cikkek