2016-08-19 55 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