繁体   English   中英

typescript:使用'字典'类型的点符号访问属性

[英]typescript: access property with dot notation using 'dictionary' type

尝试使用点表示法访问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和访问属性?

对于:

属性访问属于该索引签名的类型

在这种情况下,属性访问是括号表示法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM