TypeScript中为何无法使用点符号访问对象类型的字段类型?
为什么TypeScript中访问类型属性不能用点符号?
TypeScript的核心设计之一是严格区分类型空间和值空间,这就是你不能用点符号.访问类型属性的根本原因:
- 点符号
.是专门用于访问值的属性的语法。比如你定义了一个变量const foo = { value: 123 },foo.value会获取这个值的value属性。 - 类型层面的属性访问必须使用索引访问符
["key"],这是语法上明确区分类型操作和值操作的规则。
你觉得不存在歧义,但实际场景中很容易出现类型和值同名的情况:
// 类型空间的Foo type Foo = { value: number }; // 值空间的Foo const Foo = { value: "hello" };
这时Foo.value明确指向值空间里的字符串"hello",而Foo["value"]指向类型空间里的number。如果允许用Foo.value访问类型,编译器就无法判断你要操作的是类型还是值,必然引发歧义。
回到你的代码示例,当你写Foo.value时,编译器会默认你在访问值空间的Foo的属性,但你只定义了类型空间的Foo,所以会报错找不到对应的命名空间或变量——它在值空间里找不到Foo这个实体,自然无法解析Foo.value。
内容的提问来源于stack exchange,提问作者Guillaume Brunerie
相关产品推荐
相关产品推荐

