[英]What does this type declaration mean in Typescript?
我是Typescript的新手,我正在阅读其他人的代码并且在使用此声明时遇到问题:
private somevar: { [s: string]: string };
这是什么类型的? 方括号表示一个数组,但我对这究竟是什么形状感到困惑。
它是一种可索引类型。 查看此变量定义的类型表达式:
let myIndexVar: { [key: string]: number; };
: { ... }
表示它是一个对象。 [key: string]: number;
是对象的索引签名。 在索引签名内:
[key: string]
定义key
- 键的名称 - 以及key
- string
的类型。 : number;
是值number
的类型。 这些类型的使用方式如下:
let myIndexVar: { [key: string]: number; } = {};
myIndexVar["key"] = 4; // key is string, value is number
请注意,您可以为密钥指定任何您喜欢的名称。 给它一个描述性名称有助于说出密钥是什么,尽管变量名也应该这样做:
为了进一步解释David Sherret的回答
可索引类型与我们如何使用接口来描述函数类型类似,我们也可以描述我们可以“索引到”的类型,如[10]或ageMap [“daniel”]。 可索引类型具有索引签名,该签名描述了我们可以用来索引对象的类型,以及索引时相应的返回类型。 我们来举个例子:
interface StringArray { [index: number]: string; } let myArray: StringArray; myArray = ["Bob", "Fred"]; let myStr: string = myArray[0];
上面,我们有一个具有索引签名的StringArray接口。 此索引签名表明当StringArray使用数字编制索引时,它将返回一个字符串。
支持的索引签名有两种类型:字符串和数字。 可以支持两种类型的索引器,但从数字索引器返回的类型必须是从字符串索引器返回的类型的子类型。 这是因为当使用数字进行索引时,JavaScript实际上会在索引到对象之前将其转换为字符串。 这意味着使用100(数字)索引与使用“100”(字符串)进行索引相同,因此两者需要保持一致。
class Animal { name: string; } class Dog extends Animal { breed: string; } // Error: indexing with a 'string' will sometimes get you a Dog! interface NotOkay { [x: number]: Animal; [x: string]: Dog; }
虽然字符串索引签名是描述“字典”模式的有效方式,但它们还强制所有属性都与其返回类型匹配。 这是因为字符串索引声明obj.property也可用作obj [“property”]。 在以下示例中,name的类型与字符串索引的类型不匹配,type-checker给出错误:
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 }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.