错误 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.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/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,但无法命名的主要内容,如果未能解决你的问题,请参考以下文章