类型索引意外工作并引发无法解释的错误
Posted
技术标签:
【中文标题】类型索引意外工作并引发无法解释的错误【英文标题】:Types Indexing working unexpectedly and throwing unaccounted for errors 【发布时间】:2020-01-13 15:07:16 【问题描述】:以下代码对我来说似乎很奇怪......
export class Collection
private data: [k: string]: any = ;
constructor ()
// WORKS AS EXPECTED
this.data["hello"] = "hello";
// UNEXPECTEDLY WORKS
this.data[2] = 2;
export class Collection2
private data: [k: symbol]: any = ;
constructor ()
// DOESN'T WORK AS EXPECTED
this.data["hello"] = "hello";
// UNEXPECTEDLY DOESN'T WORK
this.data[Symbol.iterator] = function ()
如果我将索引签名设置为string
,那么应该只有字符串可以索引它吧?与符号相同。但是,数字能够索引 [k: string]
,我收到一条错误消息,指出 symbol
不能用作索引签名。
【问题讨论】:
关于使用符号作为索引类型:github.com/microsoft/TypeScript/issues/1863 您不能在索引签名中使用symbol
(无论如何都不能使用yet),因此[k: symbol]: any
是无效的TypeScript。不过,您可以使用特定的符号值属性作为类型中的键,例如 private data: [Symbol.iterator]?: any = ;
。你的用例是什么?
嗯,谢谢你的回答!但这仍然不能回答当我已经完成private data: [k: string]: any = ;
时this.data[2] = 2;
的工作原理。至于我的用例,它只是构建一个集合类来存储我的项目的数据。
【参考方案1】:
这对我来说也很奇怪,但这是预期的行为。每the docs:
索引签名参数类型必须是“字符串”或“数字”。如果您有一个带有字符串索引签名的类型,则 keyof T 将是 string |数字(不仅仅是字符串,因为在 javascript 中,您可以使用字符串(object["42"])或数字(object[42]))访问对象属性)
【讨论】:
以上是关于类型索引意外工作并引发无法解释的错误的主要内容,如果未能解决你的问题,请参考以下文章
GraphQLError [Object]:语法错误:无法解析意外字符“;”
ValueError:使用带有 seaborn 线图的索引时无法解释输入“索引”
Snowflake&SQLAlchemy“意外的'UNIQUE'
chrome.runtime.sendMessage 引发“未捕获的类型错误:无法调用未定义的方法‘sendMessage’”