我想要使用括号表示法访问类型化对象:
interface IFoo {
bar: string[];
}
var obj: IFoo = { bar: ["a", "b"] }
var name = "bar";
obj[name]. // type info lost after dot
根据我所理解的spec 4.10,这是预期的行为:
A bracket notation property access of the form ObjExpr [ IndexExpr ]
....
Otherwise, if IndexExpr is of type Any, the String or Number primitive type, or an enum type, the property access is of type Any.
任何人都可以确认这是否属实,是否有可能绕过这种行为。
修改 我的用例是
中的对象缩小var props = {long_name: "n"};
var shortName = props.long_name;
function(minObj) {
var value = minObj[shortName]
var newMinObj = {};
newMinObj[shortName] = value.toUpperCase();
db.save(newMinObj)
}
答案 0 :(得分:3)
而不是使用init(dictionary)
中的变量,you can write:
obj[x]
此处使用变量的唯一原因是从obj["bar"].sort
接口中选择任意属性。你似乎只有一个。如果你的IFoo
上有很多字符串数组,你可以使它成为可索引的并写:
IFoo
这将允许你写:
interface IFoo {
bar: string[];
bar2: string[];
[key: string]: string[]; // IFoo is indexable; not a new property
}
但它也允许你写:
var name = "bar";
obj[name].sort;