2017-02-18 3 views
1

Я использую библиотеку Twilio.js в своем приложении (а не Twilio Node), и нет модуля и титров для этой библиотеки. Доступна только глобальная переменная Twilio, которую можно использовать.Как создать эмбиентные объявления для Twilio глобальной JS-библиотеки в TypeScript?

Простейшим декларация окружающей среды можно иметь, чтобы избежать ошибок в IDE заключается в следующем:

declare const Twilio: any; 

Но я хочу пойти немного дальше, и для этого я читал машинопись руководство и несколько других ресурсов , Я обратил особое внимание на this link.

А вот то, что я до сих пор:

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; 
    } 

} 

Это работает, но это всего лишь пример, это не полный. В качестве примера, достаточно сейчас :)

Но мой вопрос три раза:

  1. Учитывая короткий образец выше, вы бы сделать что-нибудь по-другому?
  2. Если я удалю ключевое слово export со всех интерфейсов, оно по-прежнему работает. Должен ли я оставить его? Что оно делает?
  3. Учитывая использование Twilio.Device.ready(this.handleTwilioDeviceReady.bind(this));, Иды дать мне следующее при наведении мышью над:

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

    • Как я могу избавиться от Twilio.Base, появляющегося в среде IDE, и вместо этого как:

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

Похоже, есть определение типа для Twilio доступны как '@ типы/twilio' через НПМ: https://www.npmjs.com/package/@types/twilio – Seamus

+0

@Seam us Это для [Twilio Node.js вспомогательная библиотека] (https://twilio.github.io/twilio-node/), а не для той, которую я использую. Забыл связать это ... –

+1

Просто fyi, 'Twilio.Device.ready (() => this.handleTwilioDeviceReady());' будет более идиоматичным TypeScript :) – JKillian

ответ

1

Я принял взглянуть на API, и я думаю, что ниже должна быть хорошей отправной точкой в файл декларации окружающего пространства.

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; 
} 

Несколько дополнительных примечаний:

declare const Twilio: Twilio.Base; 

Это уволенные с помощью следующего объявления пространства имен, которое имеет эффект объявляя наличие простого старого объекта JS с именем и членов вас» объявлен.

Экспортировать не , чтобы иметь любую функцию при объявлении окружающих классов/пространств имен.Это необходимо, только если вы объявляете модуль с членом экспорта по умолчанию или пишете файл TS и должны объявлять, какие классы и интерфейсы будут общедоступными.

EDIT: Обратный вызов Тип для Device.Ready

IDevice имеет ready метод, принимающий аргумент функции, который передается в IDevice объект, и не ожидается ничего возвращать. Тип подписи для такой функции:

(device : IDevice) => void; 

Инлайн декларация будет:

Учитывая, что вы собираетесь повторно использовать этот обратный вызов типа несколько раз, вы должны создать type alias и затем обращаться к нему так:

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

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

Отлично, именно то, что я искал :) У меня есть 2 вопроса о последующих действиях, возможно, для этого нужен новый вопрос SO ... В качестве примера, учитывая документацию Twilio для этого: '.ready (обработчик (устройство))' как бы вы правильно объявили эту функцию? Я вижу два варианта: ** a) ** 'ready (handler: Function): void' или ** b) **' ready (обработчик: (device: IDevice) => void): void'. Какова будет ваша рекомендация? Существует ли ** c) ** альтернатива? –

+0

Моему второму следующему вопросу нужно больше текста и лучших примеров, не возражаете, если я создам новый вопрос и свяжу его здесь, чтобы вы могли посмотреть? Кажется, вы знакомы с файлами объявлений TS, и похоже, что вокруг SO существует не так много людей с такими знаниями. –

+0

@ RicardoAmaral уверенный вещь! Сделаем это, и я отвечу на оба :) –

Смежные вопросы