2016-04-12 2 views
1

У меня есть этот тип модуля Node.js, написанный на JavaScript:Объявление JavaScript расширенных функций в машинописных

function main(options) { 
    return "some string"; 
} 

main.methodName = function() { 
    // implementation; 
}; 

main.objectName = { 
    // a namespace; 
}; 

main.propertyName = 123; 

module.exports = main; 

Что такое правильный способ объявления такого интерфейса в машинописном?

РАЗЪЯСНЕНИЕ

Я спрашиваю о том, как правильно объявить такой интерфейс в машинописном для существующего модуля Node.js, поэтому он может быть использован правильно из машинопись файлов, а не как повторно реализовать такие интерфейсов в TypeScript.

UPDATE

По предложению от @toskv, я добавил следующий интерфейс:

declare module "my-module" { 

    // Default library interface 
    interface main { 
     (options?:{}):string, 
     methodName():any, 
     propertyName:any, 
     objectName:Object 
    } 

    export default main; 
} 

Но если я использую это так:

import * as myModule from "my-module"; 
var s = myModule({}); 

Тогда я получение ошибка Cannot invoke an expression whose type lacks a call signature..

Любая идея, почему?

+1

Машинопись является подмножеством JavaScript, что означает этот код, который действителен JavaScript, также действительны машинопись. –

+0

@Gothdo, в то время как это правда, TypeScript заставляет больно расширять объекты после того, как их типы определены из-за статического ввода. Как добавление свойств функции. Гораздо проще и чище преобразовать код в класс. :) – toskv

ответ

3

машинопись интерфейс, описывающий этот код будет выглядеть так:

interface MainIf { 
    (options) : string ; // the main function 
    methodName() : any; 
    propertyName: number; 
    objectName: Object; 
} 
+0

действительно он этого не делает, но это чище. :) Альтернативой является добавление утверждений типа к при добавлении дополнительных свойств в основную функцию. Я тоже примерю. :) – toskv

+0

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

+0

@ vitaly-t Я добавил еще один пример, который просто исправляет текущий код, чтобы он работал в машинописном компиляторе. Сгенерированный код js для 2 должен быть эквивалентным. – toskv

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