让我们看一下例子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