gpt4 book ai didi

typescript - 为什么命名空间重载不起作用?

转载 作者:行者123 更新时间:2023-12-04 16:55:41 25 4
gpt4 key购买 nike

下一个示例试图重载命名空间 N但不幸的是,编译器提示 A也不是 B是它的导出成员。

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

所以问题显然是:为什么编译器会提示?它提示合理吗?

Note1: The compiler version I'm using is 3.1.1



Note2: I know that the above can be written as an enum however keep that in mind that this is an oversimplified example of what I'm trying to achieve and as such this is just the bare minimum which demonstrates the problem.

最佳答案

问题在于常量是值,而不是类型。要获取常量的类型,您需要使用 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);

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

编辑

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

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

问:为什么 type N = "hello" | "world"工作但不工作 type N = N.A | N.B; ?

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

关于typescript - 为什么命名空间重载不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52820828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com