TypeScript的Indexable type让我们可以描述我们可以索引的类型。例如可以像这样定义一个字符串数组:
interface StringArray {
[key: number]: string;
}
let x: StringArray = ['Sheldon', 'Cooper'];
x[0] = 'John';
x[1] = 'Snow';
通过查看我理解的索引签名[key: number]: string;
,它定义了键/索引的名称:key
以及键的类型:string
和类型返回的值是number
。现在,当我将键的类型更改为字符串时,我收到错误。
interface MyStringArray {
[key: string]: string;
}
//Type 'string[]' is not assignable to type 'MyStringArray'.
//Index signature is missing in type 'string[]'.
var y: MyStringArray = ['Sheldon', 'Cooper']; //<- causes the error
y[0] = 'John';
y[1] = 'Snow';
当我将密钥的类型更改为string
时,我无法理解为什么它会显示警告。当key
的类型为numeric
时,为什么不会发生这种情况。是因为数组导致数组索引是数字的吗?
当我们同时拥有索引类型和其他属性时会发生什么。
示例1:它显示索引器类型错误
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
}
示例2 :当我将[index:string]
的类型更改为[index: number]
interface NumberDictionary {
[index: number]: number;
length: number; // ok, length is a number
name: string; // after chaning `index` type to number it's does'nt show error
}
答案 0 :(得分:3)
语法[key: number]: string
将数字键和值定义为字符串(以其他方式描述)。字符串数组由数字索引,因此可以用这样的结构来描述。
关于你的接口再考虑一下:
interface NumberDictionary {
[index: number]: number;
prop: string; // ok, irrelevant to indexer as prop is not a number
'1': string; // error - must return number
}
只有符合key
要求的属性才能根据索引返回类型进行验证。这是有道理的,因为您无法使用prop
语法访问[]
。
答案 1 :(得分:0)
是。这是因为string []使用数字索引。如果要将索引用作字符串,则需要更改类似下面的代码。
interface StringArray {
[index: string]: string;
}
let myArray: StringArray;
myArray["1"] = "Bob";
myArray["2"]="Fred";
let myStr: string = myArray[0];
当我们同时拥有索引类型和其他属性时会发生什么。
好吧,根据Documentation,
支持的索引签名有两种类型:字符串和数字。
因此,示例1是字符串索引签名类型,因此它们强制执行所有属性以匹配其返回类型。
虽然字符串索引签名是一种强大的描述方式 “字典”模式,他们还强制所有属性匹配 他们的回报类型。这是因为字符串索引声明了这一点 obj.property也可以作为obj [“property”]。
当您在示例2中将其更改为数字时,它将 NumberDictionary 更改为数字索引签名,因此它将允许属性具有任何返回类型。