给定对象类型,可以使用括号-字符串表示法访问其中一个字段的类型。为什么不能使用点符号,就像在Javascript中一样?它和别的东西有冲突吗?我觉得我错过了一些显而易见的东西。
type Foo = {value: number | string};
type Bar = Foo["value"]; // Works, Bar is number | string
type Baz = Foo.value;    // Error错误消息说明了名称空间,但是即使有一个名为Foo的名称空间,Foo.value也引用了一个值,而不是一个类型,所以它看起来并不模糊。
发布于 2022-10-28 08:19:26
我还问自己,当我第一次遇到这个特性时。所讨论的特性称为"索引访问类型“,如果您查看文档,很清楚为什么TypeScript选择这种语法而不是点表示法:它非常灵活。考虑以下例子:
type Person = { age: number; name: string; alive: boolean };
type I1 = Person["age" | "name"]; 
// I guess here we could do: type I1 = Person.age | Person.name; 
type I2 = Person[keyof Person];  
 
type AliveOrName = "alive" | "name";
type I3 = Person[AliveOrName];正如注释中所指出的,第一个示例可以很容易地用点表示法重写,而其他示例在数组索引表示法中更清晰。
也许TypeScript可以为简单情况添加建议的点语法作为语法糖,但我不确定每个人都会喜欢这样,因为对于相同的特性有多个符号。
发布于 2022-10-28 07:58:14
https://stackoverflow.com/questions/74232041
复制相似问题