TypeScript:"不能将命名空间用作类型"。

5
注意:我在此处找到的所有其他问题都与Angular相关,或者设置完全不同。

我有以下设置:

inner/action.ts

export type MyAction = string;

inner/functions.ts

import { MyAction } from "./action";

const identity = (action: MyAction): string => action;

export {
    identity
};

inner/index.ts

import * as MyAction from "./functions";

export { MyAction };
export * from "./action";

usage.ts

import { MyAction } from "./inner";

const action: MyAction = "";
//            ^___ error is here

错误:无法将名称空间 'MyAction' 用作类型

虽然IntelliJ提供了导航到代码中的那个位置。

为什么在这两种情况下不能使用相同的名称,我该怎么做才能让它们都有相同的名称?


“import * as MyAction” 不是意味着你已经创建了一个包含所有导出内容的名称空间“MyAction”吗?这意味着现在你有了“MyAction.MyAction”作为一种类型。例如,“import { MyAction } from…”让你可以使用“const a: MyAction”,但是“import * as Foo from…”让你可以使用“const a: Foo.MyAction”。 - jcalz
如果我输入 const action: MyAction.MyAction = ""; 它会显示 Namespace ...functions has no exported member 'MyAction'。此外,我也不能使用任何与 import * as Foo 相关的组合。 - andras
是的,你没有从“functions”中导出任何东西。我不确定为什么你要设置一个大的导入/导出链,而不是让所有东西都从一个地方导入,但这取决于你。但是,如果你想从“functions”中导入,你需要从中导出一些东西。 - jcalz
我已经通过导出进行了编辑。我这样做是因为这样我就有了一个一致的命名空间。这样环境可以在我输入MyAction时帮助我显示相关函数。import * as MyAction会强制我在各个文件中为导入命名。我使用这种方法而不是namespace关键字,以便我可以制定“1个文件=1个函数”的规则,同时仍然拥有“命名空间”。 - andras
这个例子本来是关于导入两个的,但我忘记在 functions.ts 中添加导出以进行这个小的可重现示例。实际上这并不会改变任何东西。 - andras
问题是 inner/index.ts 尝试导出两个名为 MyAction 的不同内容,而显式命名的一个(即 export { MyAction};)正在覆盖重新导出的隐式命名的内容(即 export * from "./action";),您期望进行合并而不是覆盖吗?很抱歉我在这方面没有太多见解。祝你好运! - jcalz
1个回答

2
这里的问题出在 inner/index.ts 文件中
通过执行以下操作:
import * as MyAction from "./functions";

export { MyAction };

你正在导出一个名为MyAction的命名空间,其中包括function.ts中的所有导出项。
这意味着由inner/index.ts导出的 MyAction 值是

{
    identity: (action)=>action
}

这个值覆盖了在行中从 action.ts 导出的 MyAction 的值。

export * from "./action";

你需要做的是

export * from "./functions";
export * from "./action";

这将导出 identityMyAction 而不进行任何重命名或命名空间处理


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接