前言TypeScript的官方文档已经更新,但我能找到的中文文档还是旧版本。因此,对一些新增和修改的章节进行了翻译和整理。本文整理自TypeScriptHandbook的“KeyofTypeOperator”章节。本文并没有严格按照原文翻译,部分内容也做了说明和补充。keyof类型运算符在对象类型上使用keyof运算符会返回由对象的属性名称组成的字符串或数字文字的并集。本例中的类型P等同于"x"|“y”:类型点={x:数字;y:number};typeP=keyofPoint;//typeP=keyofPoint但是如果这个类型有字符串或者number类型的索引签名,keyof会直接返回这些类型:typeArrayish={[n:number]:未知};typeA=keyofArrayish;//typeA=numbertypeMapish={[k:string]:boolean};typeM=keyofMapish;//typeM=string|number请注意,在此示例中,M是字符串|number,这是因为JavaScript对象的属性名会被转换为字符串,所以obj[0]与obj["0"]相同。(注:原文到此结束)我们在开头也说过,keyof也可能返回一个联合类型的数字字面量。它什么时候返回数字文字的联合类型?我们可以尝试构造这样一个对象:constNumericObject={[1]:"赛余1号",[2]:"赛余2号",[3]:"赛余3号"};typeresult=keyoftypeofNumericObject//typeofNumbericObject的结果是://{//1:string;//2:string;//3:string;//}//所以最后的结果是://type结果=1|2|3Symbol其实TypeScript也可以支持符号类型的属性名:constsym1=Symbol();constsym2=符号();constsym3=符号();constsymbolToNumberMap={[sym1]:1,[sym2]:2,[sym3]:3,};typeKS=keyoftypeofsymbolToNumberMap;//sym1类型|类型sym2|typeofsym3这就是为什么我们像下面的例子在泛型中使用它的时候,会报这样的错误:functionuseKey
