尝试使用点表示法访问dict属性会使Typescript抱怨。语言规范4.10规定:
ObjExpr [IndexExpr]
...如果ObjExpr的表观类型有字符串索引签名和IndexExpr 类型为Any,String或Number原始类型或枚举类型,属性访问属于该索引签名的类型。
我正在使用:
interface MapStringToFunction {
[index: string]: Function;
}
var dict: MapStringToFunction = {};
dict.say = () => 'hi';
dict.say();
MapStringToFunction有一个sting索引签名,say
是String类型,所以应该允许它?但显而易见的不是。我的错误是什么?如何更改代码以便我可以使用点表示法键入dict和访问属性?
答案 0 :(得分:2)
对于:
属性访问属于该索引签名的类型
在这种情况下,属性访问是括号表示法:
interface MapStringToFunction {
[index: string]: Function;
}
var dict: MapStringToFunction = {};
dict['say'] = () => 'hi';
dict['say']();
以下是编译时错误:
interface MapStringToFunction {
[index: string]: Function;
say: number; // Eroor
}
在我们的例子中,Function是唯一允许的属性类型:
interface MapStringToFunction {
[index: string]: Function;
say: Function;
}
但是,为了能够使用任何属性,必须声明它
否则会打开太多类型不安全的访问权限。例如如果您建议允许,则以下内容仅在运行时失败而不是编译时间:
interface MapStringToFunction {
[index: string]: Function;
}
var dict: MapStringToFunction = {};
dict.say() // Runtime error, as undefined is not callable