typescript";不是索引器的子类型";,这是什么意思?

typescript";不是索引器的子类型";,这是什么意思?,typescript,Typescript,我通过阅读索引器类型来学习打字脚本 我无法理解此代码: 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 } 首先,为什么在索引类型中添加“长度” let myDic

我通过阅读索引器类型来学习打字脚本

我无法理解此代码:

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
}
首先,为什么在索引类型中添加“长度”

let myDict : NumberDictionary;
myDict[10] = 23;
NumberDictionary是一种索引类型。为什么数字词典定义中有长度?索引类型应该是[10],为什么会有长度?javascript中的数组对象具有长度,但索引类型是数组吗?如果是,为什么上面的示例定义了长度?有必要吗? 对不起,我的咆哮。你可以看到我很困惑

秒,

name: string;// error, the type of 'name' is not a subtype of the indexer
我不明白这条线上的评论。为什么名称必须是索引器的子类型?索引器就像一个[10]=“Tom”,那么索引器的子类型是什么

我不明白这条线上的评论。为什么名称必须是索引器的子类型

因为对于任何
string
访问类型,脚本将采用类型
number
(基于
[索引:string]:number;
)。所以如果
name:string是允许的,以下假定为
数字
,但实际上您可能认为是字符串:


参见
y
z
^

要回答第一个问题,NumberDictionary是一个对象接口。它不是数组接口。索引签名是指对象内部的任何索引

NumberDictionary对象有两个强制值
length
name
。只有当它与索引签名(索引和值类型)匹配时,它才能具有额外的属性

接口
接口编号词典{
[索引:字符串]:数字|字符串;
长度:数字;
名称:字符串;
}
设nd:NumberDictionary={length:10,name:“Ten”,lang:“en”};
索引签名
[索引:字符串]:数字|字符串;
这意味着我可以为我的对象设置一个额外的
lang:string
,而不会出现类型错误

如果您知道
lang:string
在我的对象中必须是可选的,那么您必须在我的界面中设置它

接口编号词典{
[索引:字符串]:数字|字符串;
长度:数字;
名称:字符串;
lang?:字符串;
}
设nd:NumberDictionary={length:10,name:“Ten”,lang:“en”};

该代码的目的是作为一个坏例子。因此,我假设,'ok'注释仅表示从类型检查器的角度来看它是ok的,而不是说它在一般情况下是有意义的。该属性可以通过索引器语法访问,[“name”]将返回一个数字,而不是由索引器类型签名定义的字符串。
let x: NamedDictionary = Object.create(null);
let n = "name";
let y = x[n]; // TypeScript assumes `number`
let z = x["name"]; // Would you want `string`?