【问题标题】:Typescript error: "Return type of exported function has or is using name <n> from external module <M> but cannot be named"打字稿错误:“导出函数的返回类型具有或正在使用来自外部模块 <M> 的名称 <n>,但无法命名”
【发布时间】:2018-07-09 06:36:33
【问题描述】:

使用 Typescript 2.6.2,我开发了一个返回 Observable 的函数。此功能是在我已发布为名为 my-package 的包的模块中开发的。

函数在文件my-function.ts中定义

import { Observable } from 'rxjs/Observable';

export function myFunction() {
    return Observable.from([1,2,3]));
}

模块有它的 index.ts 本身

import {myFunction} from './my-function';

export {myFunction};

现在我想在另一个项目中使用 my-function。因此我导入 my-package,然后编写一个新函数 newFunction,它在一个看起来像

的文件中使用 my-function >
import {myFunction} from 'my-function';

export function newFunction() {
    return myFunction();
}

如果这样做,当我尝试编译最后一个文件时,我会收到一个错误,其文本为

导出函数的返回类型已经或正在使用来自外部模块“~/node_modules/rxjs/Observable”的名称“Observable”,但无法命名。

为了解决这个问题,我必须更改 newFunction 的代码

 import { Observable } from 'rxjs/Observable';
 import {myFunction} from 'my-function';

 export function newFunction(): Observable<any> {
     return myFunction();
 }

有没有办法避免编译器问题而不必显式声明 newFunction 的返回类型?

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

    该错误消息特别提到“名称Observable”,它不在定义newFunction的模块范围内,这会阻止编译器为该模块生成类型声明文件。

    要修复它,您只需导入该名称 - Observable - 仅此而已。只需将此行添加到newFunction 模块:

    import { Observable } from 'rxjs/Observable';
    

    这足以使编译器在生成的.d.ts 文件中为newFunction 拼出推断的返回类型,您不必显式声明该返回类型。

    【讨论】:

    • 我已经明确添加了返回类型,因为我在 tsconfig.json 中指定了"noUnusedLocals": true - 但这可能是另一回事。我想知道允许编译器静默导入所需的内容(在这种情况下为 Observable)是否有意义,而不必强制显式导入,考虑到错误消息显示编译器知道所有内容(即要导入哪个类从哪个包)。还是谢谢
    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2017-10-09
    • 2018-01-06
    • 2019-06-06
    • 1970-01-01
    • 2017-02-13
    相关资源
    最近更新 更多