2013-06-23 5 views
0

я пытаюсь создать следующее async.d.ts:Node.js и файл определения машинопись для async.js

interface AsyncIteratorCallback { 
    (err?: string): void; 
} 
interface AsyncEachIterator<T>{ (item: T, callback: AsyncIteratorCallback): void;} 

declare module "async" { 


    // Collections 
    function each<T>(arr: T[], iterator: AsyncEachIterator<T>, callback: AsyncIteratorCallback): void; 
} 

, но я не имею права делать ERR? необязательно в AsyncIteratorCallback?

, когда я использую его:

async.each([],(item,cb) => {},(err) => {}); 

я получить Call signatures of types '(err: string) => void' and '"async".AsyncIteratorCallback' are incompatible:

ответ

0

UPDATE:

Я попробовал этот код в Visual Studio 2012

interface test { 
    (err:string):void 
} 

var a = (err: string) => { }; 
var b = (param: test) => { }; 
b(a); 

Он работает. По-видимому, функция a реализует тест интерфейса. Тогда я изменил этот код:

interface test { 
    (err?:string):void 
} 

var a = (err: string) => { }; 
var b = (param: test) => { }; 
b(a); // error, incompatible call signatures 

Теперь функция не реализует интерфейс. Решение состоит в том, чтобы добавить? к параметру функции. Этот код работает снова:

interface test { 
    (err?:string):void 
} 

var a = (err?: string) => { }; 
var b = (param: test) => { }; 
b(a); // error, incompatible call signatures 

Наконец я попытался следующие:

interface test { 
    (err:string):void 
} 

var a = (err: string) => { }; 
var b = (param: test) => { }; 
b({ method:a }); // error, no overload of call 

Я уже задавался вопросом об определении интерфейса, так как я никогда не видел интерфейс с методом без имени. Кажется, что объект не может реализовать этот интерфейс. Даже этот код не работает:

b({ call: a }); 

Решение

Вы должны просто добавить? к вашей лямбде. (err?)=>{}

+0

его не пустой объект, его лямбда. function ano (item, cb) {}. –

+0

вы правы, я играл с VisualStudio и обновлял свой ответ – lhk

+0

спасибо :) Он компилируется. –