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

Posted

技术标签:

【中文标题】错误 TS4058:导出函数的返回类型具有或正在使用来自外部模块 Y 的名称 X,但无法命名【英文标题】:error TS4058: Return type of exported function has or is using name X from external module Y but cannot be named 【发布时间】:2017-09-06 05:10:21 【问题描述】:

使用 tsc v2.2.2

如何修复 typescript 编译器错误:

错误 TS4058:导出函数的返回类型有或正在使用名称 来自外部模块的“SomeInterface” “一些路径/dist/types” 但不能命名。

我有 index.tssomething.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/some-module/dist/types” 但不能命名。

【问题讨论】:

ICoolInterface 用于默认导出的推断返回类型,但ICoolInterface 不导出。添加export ICoolInterface 应该可以解决您的问题。欲了解更多信息:github.com/Microsoft/TypeScript/issues/8612 @cartant 不,我尝试添加 export IcoolInterface 没有成功。即使导出仍然有错误。 我以前解决过这个问题,但我想我的回忆有点可疑。可能是您需要明确返回类型:export default function (): (coolInterface: ICoolInterface) => void /* or whatever the return type is */ ... - 而不是让它被推断出来。 可能相关:***.com/a/41137419/6680611 @cartant for me return type :any for default export in 'index.ts' 成功了。并且无需导出ICoolInterface。也许使用 :any 这样的做法是一种不好的做法,但至少它可以编译,并且我在 'something.ts' 中的函数用 arg 类型和返回类型很好地描述了。 【参考方案1】:

对我来说 return type :any for default export in 'index.ts' 可以解决问题。并且无需导出ICoolInterface。也许使用 :any 这样的做法是一种不好的做法,但至少它可以编译,并且我在 '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) 
     // ...
  ;

【讨论】:

谢谢,这已解决 - 错误 TS2305:模块没有导出成员【参考方案2】:

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

目前需要在index.ts中显式导入ICoolInterface

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

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

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

发射器可以编写额外的导入,但这本来是 以您在您的未明确说明的方式更改您的 API 形状 代码。所以我们选择了出错。

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

我认为我们应该重新考虑这个设计决定, 并添加导入。

注意:如果您使用的是 WebStorm,您将收到有关未使用导入的警告。您可以使用导入上方的注释 //noinspection ES6UnusedImports 禁用警告。 GUI 替代方案:在出现警告的导入行上按Alt + Enter。在Remove unused 'import' 弹出菜单上向右箭头可查看更多选项,然后选择Suppress for statement 以禁用此特定行上的警告。

【讨论】:

以上是关于错误 TS4058:导出函数的返回类型具有或正在使用来自外部模块 Y 的名称 X,但无法命名的主要内容,如果未能解决你的问题,请参考以下文章

TS4023:导出的变量 <x> 具有或正在使用来自外部模块的名称 <y>,但无法命名

导入具有导出枚举的模块时找不到模块错误

打字稿中具有通用键的对象

TS泛型类、泛型接口、泛型函数

Typescript 推导出泛型成员函数的返回类型

TS泛型理解学习笔记