2017-02-18 1 views
1

J'utilise la bibliothèque Twilio.js sur mon application (pas Twilio Node) et il n'y a pas de module ni de typage pour cette bibliothèque disponible. Il n'y a qu'une variable globale Twilio disponible que l'on peut utiliser.Comment créer des déclarations ambiantes pour la bibliothèque JS globale Twilio dans TypeScript?

La déclaration ambiante plus simple peut avoir pour éviter les erreurs dans l'EDI est la suivante:

declare const Twilio: any; 

Mais je veux aller un peu plus loin et que j'ai lu manuel dactylographiée et quelques autres ressources . J'ai pris particulièrement l'attention au this link.

Et voici ce que j'ai jusqu'à présent:

declare const Twilio: Twilio.Base; 

declare namespace Twilio { 

    export interface Base { 
     Device: Device; 
    } 

    export interface Device { 
     ready(handler: DeviceCallback): void; 
    } 

    export interface DeviceCallback { 
     (device: Device): void; 
    } 

} 

Cela fonctionne, mais il est juste un échantillon, ce n'est pas complète. À titre d'exemple, il suffit pour l'instant :)

Mais ma question est triple:

  1. Compte tenu court exemple ci-dessus, voulez-vous faire quelque chose différemment?
  2. Si je supprime le mot-clé export de toutes les interfaces, cela fonctionne toujours. Devrais-je encore le laisser? Qu'est ce que ça fait?
  3. Compte tenu de l'utilisation Twilio.Device.ready(this.handleTwilioDeviceReady.bind(this));, IDEs me donner ce qui suit en vol stationnaire ma souris sur:

    • Twilio: const Twilio: Twilio.Base
    • Twilio.Device: (property) Twilio.Base.Device: Twilio.Device
    • Twilio.Device.ready: (method) Twilio.Device.ready(handler: Twilio.DeviceCallback): void

    • Comment puis-je se débarrasser de Twilio.Base apparaissant dans l'IDE et à la place s comment:

      • Twilio: const Twilio: Twilio
      • Twilio.Device: (property) Twilio.Device: Twilio.Device
+0

on dirait qu'il ya une définition de type pour Twilio disponible '@ types/twilio' via NPM: https://www.npmjs.com/package/@types/twilio – Seamus

+0

@Couture C'est pour [Twilio Node.js helper library] (https://twilio.github.io/twilio-node/), pas pour celui que j'utilise. J'ai oublié de lier cela ... –

+1

Juste fyi, 'Twilio.Device.ready (() => this.handleTwilioDeviceReady());' serait plus typé TypeScript :) – JKillian

Répondre

1

J'ai pris un coup d'œil à l'API et je pense que le ci-dessous devrait être un bon point de départ comme un fichier de déclaration ambiant.

declare namespace Twilio { 

    class Connection { 
     // Constructor does not appear to be available to user. 
     private constructor(); 
     // Add Connection Methods and Properties Here 
    } 

    // Not immediately clear if Twilio.Device is a class or not. 
    interface IDevice { 
     setup(token, options); 
     ready(handler); 
     offline(handler); 
     incoming(handler); 
     connect(params) : Connection; 
     // Add Remainder of Twilio.Device properties here. 
    } 

    /** 
    * Twilio.Device appears to be a singleton object that 
    * you don't instantiate yourself. You can use 
    * the below to declare its presence. 
    */ 
    let Device : IDevice; 
} 

Quelques notes plus:

declare const Twilio: Twilio.Base; 

Ceci est rendu superflu par la déclaration d'espace de noms suivant, qui a pour effet de déclarer la présence d'une plaine ancien objet JS avec le nom et les membres vous » a déclaré.

L'exportation n'apparaît pas pour avoir une fonction quelconque lors de la déclaration de classes/espaces de noms ambiants.Cela n'est nécessaire que si vous déclarez un module avec un membre d'exportation par défaut, ou si vous écrivez un fichier TS et devez déclarer quelles classes et interfaces seront accessibles au public.

EDIT: Type de rappel pour Device.Ready

IDevice a la méthode ready, qui accepte un argument de fonction qui est passé un objet IDevice, et ne devrait pas retourner quoi que ce soit. La signature de type pour une telle fonction est:

(device : IDevice) => void; 

Une déclaration en ligne serait:

Étant donné que vous allez utiliser ce rappel de type plusieurs fois, vous devez créer un type alias et puis se réfèrent à lui comme ceci:

type DeviceCallback = (device : IDevice) => void; 

interface IDevice { 
    ... 
    ready(handler: DeviceCallback) : void; 
    offline(handler : DeviceCallback) : void; 
    ... 
} 
+0

Super, exactement ce que je cherchais :) J'ai 2 questions de suivi, on demande probablement une nouvelle question SO ... A titre d'exemple, compte tenu de la documentation de Twilio pour cela: '.ready (handler (device))' comment déclarerais-tu correctement cette fonction? Je vois deux options: ** a) ** 'prêt (handler: Fonction): void' ou ** b) **' ready (handler: (device: IDevice) => void): void'. Quelle serait votre recommandation? Y a-t-il une alternative ** c) **? –

+0

Ma deuxième question de suivi a besoin de plus de texte et de meilleurs exemples. Cela vous dérange-t-il si je crée une nouvelle question et que je la lierai ici pour que vous y jetiez un coup d'œil? Vous semblez connaître votre chemin à travers les fichiers de déclaration TS et il semble qu'il n'y ait pas trop de personnes ayant ce genre de connaissances autour de SO. –

+0

@RicardoAmaral chose sûre! Fais-le et je répondrai aux deux :) –