讓我們看一下例子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>
。
你不應該在Typescript中使用它們。馬上去「異步」/「等待」! – Bergi
您是否嘗試過註釋類型?問題在哪裏?請向我們展示您的努力。 – Bergi
@Bergi異步/等待似乎還沒有被NodeJS支持。我已經嘗試了一些註釋,但似乎沒有任何工作;爲了簡潔,我省略了它們,因爲它們都感覺很蠢。但我可以添加一些來展示我的作品,當然。 – Ludwik