【问题标题】:How to annotate generator functions in typescript如何在打字稿中注释生成器函数
【发布时间】: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


【解决方案1】:

但我不确定 T 应该是什么

在您的情况下,login 不会向Promise<void> 返回任何内容。

【讨论】:

  • 但是异步函数可能会与其他类型的生成器函数一起使用,那么我该如何在打字稿中表达呢? promise 中的类型应该和生成器中的类型一致,但是生成器类型注解长什么样子呢?
猜你喜欢
  • 2014-02-14
  • 1970-01-01
  • 2019-03-11
  • 2023-03-19
  • 2021-10-26
  • 2021-12-04
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多