繁体   English   中英

如何使用 typescript 键入异步 function

[英]How to type async function using typescript

我正在使用 typescript 和 nlp.js/
但是参数管理器说'参数管理器隐含地具有任何类型。
我尝试使用:但效果不佳。 在这种情况下我该如何输入? 感谢您阅读。

module.exports = async function trainnlp(manager) {
  await manager.addAnswer('en', 'greetings.arrival', "I've missed you");

  manager.save('./model.nlp', true);
}

如何使用 typescript 键入异步 function

async函数的返回值的类型是Promise<X> ,其中X是将提供的实现值。 在您的情况下,由于您的 function 在任何地方都没有return ,因此它将是Promise<void> ,因为由您的 function 创建的 promise 将没有任何特别之处。 (在运行时,实现值将是undefined ,但出于类型目的,它被建模为Promise<void> 。)

最新版本的 TypeScript 将为您默认返回类型,这就是错误与manager有关的原因......

但是参数管理器说'参数管理器隐含地具有任何类型。

这是该代码的真正问题: manager没有类型。 TypeScript 的重点是在编译时提供强类型。 如果你不告诉它应该是什么类型manager ,它就不能为你的trainnlp function 做到这一点。 您想为manager提供一个类型:

// (Just an example type)
interface Manager {
    addAnswer(a: string, b: string, c: string): Promise<void>;
    save(a: string, b: boolean): void;
}

async function trainnlp(manager: Manager) {
// ----------------------------^^^^^^^^^
  await manager.addAnswer('en', 'greetings.arrival', "I've missed you");

  manager.save('./model.nlp', true);
}

在操场上

这清除了错误标记的问题。 然后 TypeScript 将推断 function 的返回类型,因为它认为它是async Promise<void> ,但从不使用它的return类型。

这不是异步 function 问题,而是编译器问题。 在您的tsconfig.json中,您将标志noImplicitAnytrue ,您可以将其设置为false 但对于这样一个微不足道的案例,这是一个坏主意。

一个更好的方法是指定manager的类型,如果你真的想要,你甚至可以将其设置为any类型,但我认为你不需要它。

module.exports = async function trainnlp(manager:any) {
  await manager.addAnswer('en', 'greetings.arrival', "I've missed you");

  manager.save('./model.nlp', true);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM