【问题标题】:Why is namespace overloading not working?为什么命名空间重载不起作用?
【发布时间】:2018-10-15 16:14:37
【问题描述】:

下一个示例尝试重载命名空间 N,但不幸的是编译器抱怨 AB 都不是它的导出成员。

namespace N
{
    export const A = 'hello';
    export const B = 'world';
}

type N = N.A | N.B;

const a: N = N.A;
const b: N = N.B;

console.log(a, b);

尽管如此,运行编译后的代码会得到以下预期输出:

hello world

所以问题显然是:为什么编译器会抱怨?投诉合理吗?

注意1我使用的编译器版本是3.1.1

注意2我知道上面可以写成enum,但是请记住,这是我正在尝试的一个过于简单的例子实现,因此这只是说明问题的最低限度。

【问题讨论】:

  • 您可以使用type N = (typeof N)[keyof typeof N] 将命名空间的导出值捕获为联合类型。
  • @Aaron 这是一个很好的观点,但是当我把它放在 Titian Cernicova-Dragomir 的回答下面的 cmets 上时,这个表达式可能有效,但它不能解释为什么必须在第一个使用 typeof地点!

标签: typescript namespaces export overloading


【解决方案1】:

问题在于常量是值,而不是类型。要获取常量的类型,您需要使用typeof

namespace N
{
    export const A = 'hello';
    export const B = 'world';
}

type N = typeof N.A | typeof N.B;

const a: N = N.A;
const b: N = N.B;

console.log(a, b);

注意:类型和命名空间实际上没有任何共同点,它们是不同的符号,只是碰巧有相同的名称。没有合并行为(例如会有接口和类)

编辑

问:为什么N.A的类型不是string

A: N.A 的类型不是字符串,因为您使用了const 声明。如果您使用 const,则推断出可能的最窄类型。在这种情况下,这是字符串文字类型“hello”。

问:为什么type N = "hello" | "world" 有效,而type N = N.A | N.B; 无效?

A:Typescript 允许使用字符串字面量作为我们上面看到的类型。但它们是类型。你不能在表达式中使用它们,你只能在类型注释中使用N(即这不起作用let a = N)。另一方面,变量是一个值。您可以在表达式中使用它,而不是在类型注释中使用它(例如,let o:N.A 是一个错误)。要获取变量的类型,您需要 typeof(所以这将起作用:let o: typeof N.A

【讨论】:

  • 嘿,谢谢你的回答,但是 1. 我已经在 Note2 中说过我知道enum 解决方案,2. 你对它为什么不起作用的解释没有意义你认为type N = "hello" | "world"; 是一个有效的类型声明,因为这些字符串是values 而不是types。 Ofc const h = "hello"; const w = "world"; type N = h | w; 不起作用,这让我认为类型声明只会接受文字作为值,这至少可以说是奇怪的。而且天真地认为N.A的类型应该是string,为什么不是?
  • N.A 的类型不是字符串,因为您使用了 const。如果您使用 const,则推断出可能的最窄类型。在这种情况下,这是字符串文字类型"hello" 。这让我想到了为什么你可以写type N = "hello"; Typescript 允许使用字符串文字作为类型。但它们是类型。你不能在表达式中使用它们,你只能在类型注释中使用N。另一方面,变量是一个值。您可以在表达式中使用它,而不是在类型注释中使用它(试试看)。要获得变量的类型,您需要我在答案中使用的 typeof 运算符。
  • 我会接受你的回答,但你能否用这个解释来扩展它,因为我的问题总是关于编译器及其抱怨,而不是真正关于如何解决我给出的玩具示例。干杯伙伴!
  • @PeterVaro 添加了解释,我昨晚已经睡觉了:)
猜你喜欢
  • 2015-02-24
  • 2014-12-29
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多