Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 为什么字符串索引签名强制所有属性都与其返回类型匹配?_Typescript - Fatal编程技术网

Typescript 为什么字符串索引签名强制所有属性都与其返回类型匹配?

Typescript 为什么字符串索引签名强制所有属性都与其返回类型匹配?,typescript,Typescript,发件人: 虽然字符串索引签名是描述“dictionary”模式的一种强大方式,但它们还强制要求所有属性与其返回类型匹配 然后显示此界面: interface NumberDictionary { [index: string]: number; length: number; // ok, length is a number name: string; // error, the type of 'name' is not a subtype of th

发件人:

虽然字符串索引签名是描述“dictionary”模式的一种强大方式,但它们还强制要求所有属性与其返回类型匹配

然后显示此界面:

interface NumberDictionary {
    [index: string]: number;
    length: number;    // ok, length is a number
    name: string;      // error, the type of 'name' is not a subtype of the indexer
}
我的问题是-为什么
name
必须是索引器的子类型?如果我有一个对象,其中除了
名称
之外的所有内容都应该是
数字
,而
名称
字符串
,该怎么办

然后,文件说:

这是因为字符串索引声明
obj.property
也可以作为
obj[“property”]
使用

如果
name
string
而不是
number
,我仍然可以使用
obj.name
obj[“name”]
访问它?我看不出这有什么不同

我看不出这有什么不同

因为后者,
obj[“name”]
通过indexer属性,至少可能是这样。更好的例子可能是:

declare let s: string;
console.log(obj[s]);
…很明显,我们使用的是字符串,而不是字符串文字
“name”
。Indexer属性允许您执行此操作,而如果您执行此操作,则没有Indexer属性:


由于所有属性都可以通过这种方式访问,因此它们必须具有相同的类型。

我明白了。这是一种类型脚本限制,因为类型是在编译时检查的,而
s
的值未知,因此元素的类型也未知。如果文档将
obj.property
obj[someValue]
进行比较,而不是将
obj[“property”]
进行比较,我认为这会更容易理解,因为typescript实际上可以读取后者,并在编译时知道元素的类型(因为它的键是字符串文本,而不是未知值)。是吗?@HristiyanDodov-我同意,是的。毕竟,如果使用字符串文字,则不需要索引器。
interface NumberDictionary {
//    [index: string]: number;       commented out indexer
    length: number;
    name: string;
}

let x: NumberDictionary = {length: 0, name: "foo"};
declare let s: string;
console.log(x[s]);
            ^^^^
            Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'NumberDictionary'.