2016-08-19 59 views
3

让我们看一下例子async功能从promisejs.org,这也是让我们用发电机等承诺:如何标注在打字稿发生器功能

function async(makeGenerator){ 
    return function() { 
    var generator = makeGenerator.apply(this, arguments); 

    function handle(result){ 
     // result => { done: [Boolean], value: [Object] } 
     if (result.done) return Promise.resolve(result.value); 

     return Promise.resolve(result.value).then(function (res){ 
     return handle(generator.next(res)); 
     }, function (err){ 
     return handle(generator.throw(err)); 
     }); 
    } 

    try { 
     return handle(generator.next()); 
    } catch (ex) { 
     return Promise.reject(ex); 
    } 
    } 
} 

用法示例:

var login = async(function* (username, password, session) { 
    var user = yield getUser(username); 
    var hash = yield crypto.hashAsync(password + user.salt); 
    if (user.hash !== hash) { 
    throw new Error('Incorrect password'); 
    } 
    session.setUser(user); 
}); 

我问题:这两个函数应该如何在TypeScript中进行注释,以保持类型安全?

我已经试过: 我知道async函数返回一个Promise<T>,但我不知道T应该是什么。我想它应该取决于传入的发电机,但发电机有哪种类型?在nodejs或蓝鸟的类型中有GeneratorFunction(不记得是哪一个),但那个不是通用的,所以我不能像我想的那样做async(makeGenerator: GeneratorFunction<T>): Promise<T>

+0

你不应该在Typescript中使用它们。马上去“异步”/“等待”! – Bergi

+0

您是否尝试过注释类型?问题在哪里?请向我们展示您的努力。 – Bergi

+0

@Bergi异步/等待似乎还没有被NodeJS支持。我已经尝试了一些注释,但似乎没有任何工作;为了简洁,我省略了它们,因为它们都感觉很蠢。但我可以添加一些来展示我的作品,当然。 – Ludwik

回答

0

,但我不知道是什么T应当

在你的情况login没有返回Promise<void>

+0

但是,异步函数可能会与其他类型的生成器函数一起使用,那么我如何在打字稿中表达呢? promise中的类型应与生成器中的类型相同,但生成器类型注释的外观如何? – Ludwik