【发布时间】:2016-12-26 08:47:46
【问题描述】:
让我们看一下来自promisejs.org 的示例async 函数,它允许我们使用生成器等待承诺:
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 或 bluebird 的分型中有GeneratorFunction(不记得是哪个),但那个不是通用的,所以我不能像我想要的那样做async(makeGenerator: GeneratorFunction<T>): Promise<T>。
【问题讨论】:
-
你根本不应该在 Typescript 中使用这些。马上去
async/await吧! -
你试过注释类型吗?问题出在哪里?请向我们展示你的努力。
-
@Bergi async/await 似乎还不被 NodeJS 支持。我尝试了一些注释,但似乎没有一个有效;为简洁起见,我省略了它们,因为它们都觉得很愚蠢。但是我可以添加其中一些来展示我的作品,当然。
-
Node 不支持也没关系-it's supported by TypeScript!这不是您使用转译器的全部原因吗?
-
github.com/Microsoft/TypeScript/issues/2873 似乎进行了相关讨论,尽管我无法确切弄清楚他们的结果是什么。无论如何,我认为你的类型是
function async(makeGenerator:(...*) -> Iterable<T>): (...*) -> Promise<T>,打字稿的类型系统不会让你表达任何更高级的。
标签: javascript typescript promise generator