错误TS4058:导出函数的返回类型具有或正在使用来自外部模块Y的名称X但不能命名为

时间:2017-04-11 01:32:25

标签: typescript typescript-typings typescript2.0

  

使用tsc v2.2.2

如何修复typescript编译器错误:

  

错误TS4058:导出函数的返回类型具有或正在使用名称   ' {SomeInterface}'来自外部模块   " {some path} / dist / types"   但无法命名。

我的文件夹包含 index.ts something.ts

// index.ts
import something from './something'

// error will point on this export below
export default function () {
   return {
     resultFunctionFrom: something()
   };
}


// something.ts
import {ICoolInterface} from 'some-module'

export default function () {
  return function (rootOfEvil:ICoolInterface) {
     // ...
  };
}

我会用这样的代码得到这个错误:

  

错误TS4058:导出函数的返回类型具有或正在使用名称   ' ICoolInterface'来自外部模块   " /文件夹/ node_modules /一些模块/ DIST /类型"   但无法命名。

2 个答案:

答案 0 :(得分:3)

对我来说,返回类型:'index.ts'中的任何默认导出都可以解决问题。而且无需导出ICoolInterface。也许使用它是一种不好的做法:任何像这样但至少它编译并且我在'something.ts'中的函数很好地描述了arg类型和返回类型。 所以这将有效:

// index.ts
import something from './something'

// error will point on this export below
// ------------------------\/-----------
export default function ():any { // trouble solver
// ------------------------/\-----------
   return {
     resultFunctionFrom: something()
   };
}


// something.ts
import {ICoolInterface} from 'some-module'

export default function () {
  return function (rootOfEvil:ICoolInterface) {
     // ...
  };
}

答案 1 :(得分:1)

更新:这应该不再发生在TypeScript 2.9中,并解决了下面链接的问题9944。 https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript#relaxing-declaration-emit-visiblity-rules

目前,您需要在ICoolInterface中明确导入index.ts

// index.ts
import {ICoolInterface} from 'some-module'

考虑跟踪此GitHub issue他们正在考虑更改此TypeScript行为的位置。

  

函数或变量没有明确的类型注释。   声明发射器推断出它们的类型并尝试编写它。如果   类型来自不同的模块,然后是。它需要添加一个   进口或b。错误。

     

发射器可以写入额外的导入,但那可能就是   以您未明确指出的方式更改API形状   码。所以我们选择了错误。

     

修复方法是在源代码上添加显式类型注释   问题。

     

有了这个,我想我们应该重新考虑这个设计决定,   并且无论如何都要添加进口。

注意:如果您使用的是WebStorm,则会收到有关未使用导入的警告。您可以使用导入上方的评论//noinspection ES6UnusedImports停用警告。 GUI替代方法:在导入行上按Alt + Enter并显示警告。右箭头显示Remove unused 'import'弹出式菜单上的更多选项,然后选择Suppress for statement以禁用此特定行上的警告。