如何使用打字稿键入异步功能

时间:2019-11-03 12:09:58

标签: javascript node.js typescript

我正在使用打字稿和nlp.js /
但是参数管理器说“参数管理器暗含任何类型。
我尝试使用:,但效果不佳。 在这种情况下如何输入?感谢您阅读。

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

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

2 个答案:

答案 0 :(得分:4)

  

如何使用打字稿键入异步功能

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

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

相关的原因
  

但是参数管理器说'参数管理器暗含任何类型。

这是该代码的真正问题:manager没有类型。 TypeScript的重点是在编译时提供强类型。如果您不告诉trainnlp应该是什么类型,它就不能为您的manager函数做到这一点。您要提供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);
}

On the playground

这清除了错误标记的问题。然后,TypeScript会推断出该函数的返回类型,因为它发现它是一个async函数,但从未使用过return,因此其类型无疑是Promise<void>

答案 1 :(得分:-1)

这不是异步函数问题,而是compiler问题。在tsconfig.json中,您将noImplicitAny标记为true,可以将其转到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);
}