类型索引意外工作并引发无法解释的错误

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]:语法错误:无法解析意外字符“;”

javascript 异常处理

ValueError:使用带有 seaborn 线图的索引时无法解释输入“索引”

微信小程序——try {} catch (e) {}

Snowflake&SQLAlchemy“意外的'UNIQUE'

chrome.runtime.sendMessage 引发“未捕获的类型错误:无法调用未定义的方法‘sendMessage’”