2015-09-17 2 views
2

В машинописи я понимаю how to specify the shape of an external library. Рассмотрим хотя бы случай, когда нужна только одна функция из библиотеки, или библиотека является единственной (возможно, перегруженной) функцией (например, this library for the function merge). Необходимость вызова функции с использованием именем модуля -dot- имени функции довольно многословно:Машинопись: Работа с другими библиотеками JavaScript с одной функцией

В файле merge.d.ts:

declare module "merge" { 
    export function merge(o: Object, ...args: Object[]): Object; 
    export function merge(isDeep: boolean, o: Object, ...args: Object[]): Object 
} 

В некотором тестовом файле:

///<reference path="merge.d.ts"/> 
import merge = require('merge'); 
merge.merge({x: 1}, {y: 2}); 

Есть другой способ чтобы это могло эффективно заменить merge.merge только merge на линии 3, все еще делая типы проверки?

+0

На самом деле, этот код даже не работает. Несмотря на то, что он проверяет тип во время выполнения, во время выполнения функция 'merge.merge' не определена. Я думаю, проблема заключается в том, что «слияние» npm - это только функция, а не модуль. –

ответ

1

Использование export =. Вот полный пример:

declare module "merge" { 

    interface Merge { 
     merge(o: Object, ...args: Object[]): Object; 
     merge(isDeep: boolean, o: Object, ...args: Object[]): Object; 
    } 
    var merge:Merge; 
    export = Merge; 
} 
+0

Я получаю ошибку компиляции во втором вхождении модификатора 'declare':" 'declare', который не разрешен для кода уже в окружающем контексте. " При удалении этой ошибки удаляется ошибка компиляции, но тогда символ-слияние не может быть найден в файле импорта. –

1

ES6 деструктурирующий извлечет определенную функцию для вас:

import { merge } from 'merge'; 
merge({x: 1}, {y: 2}); 

Вы не должны изменять структуру модуля.

Другие примеры здесь: http://www.2ality.com/2014/09/es6-modules-final.html

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