【问题标题】:Typescript inference issue - Return type of exported function has or is using name ... but cannot be named打字稿推理问题 - 导出函数的返回类型具有或正在使用名称...但无法命名
【发布时间】:2018-09-25 04:18:11
【问题描述】:

我想创建一个函数,将基于 Promise 的函数(在我的示例中从 mongodb 节点客户端)转换为 Observable。

代码很简单

export function updateOneObs(filter: Object, object: Object, collection: Collection<any>) {
    return Observable.fromPromise(collection.updateOne(filter, object));
}

如果我把它放在 VSCode 中,我会收到一条错误消息,上面写着

“导出函数的返回类型已经或正在使用来自外部模块“.../npm-packages/observable-mongo/node_modules/@types/mongodb/index”的名称“UpdateWriteOpResult”,但无法命名。 "

要解决这个问题,我需要通过显式导入缺少的类型

import {UpdateWriteOpResult} from 'mongodb';

考虑到错误消息清楚地表明 Typescript 知道在哪里寻找丢失的类型,有没有办法通过推理解决而不显式导入?

在我的情况下,导入有一个额外的小缺点:因为我已经使用 "noUnusedLocals": true 设置了 Typescript 编译器,一旦我导入缺少的类型,如果我想避免另一个错误,我必须在某处使用它。

【问题讨论】:

    标签: typescript type-inference


    【解决方案1】:

    仅当您拥有"declaration": true, 时才会出现此错误。如果您不需要声明,您可以禁用此选项。如果确实需要声明,则必须为该类型创建本地名称。要生成声明,打字稿需要使用本地名称作为返回类型。编译器知道原始类型的位置(正如它在错误中指出的那样),但要生成声明,它必须在模块中为该类型提供一个别名,而这是设计上不会做的(编译器不在为类型命名的业务,尤其是当您的文件中可能与其他名称发生冲突时)

    【讨论】:

    • 我实际上使用"declaration": true" 作为编译器选项,因为我需要生成声明或者更好的是我找到了方便的 TS 编译器来生成声明。考虑到要解决这个问题,我唯一要做的就是import {UpdateWriteOpResult} from 'mongodb',那么我想知道编译器是否可以将此作为默认行为,即自动添加导入语句。无论如何感谢您的回答。
    猜你喜欢
    • 2018-07-09
    • 2017-09-06
    • 2019-08-08
    • 2017-02-23
    • 2023-02-07
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多