Typescript 类型索引意外工作并抛出未解释的错误

Typescript 类型索引意外工作并抛出未解释的错误,typescript,typescript-types,typescript-class,Typescript,Typescript Types,Typescript Class,以下代码对我来说很奇怪 export class Collection { private data: {[k: string]: any} = {}; constructor () { // WORKS AS EXPECTED this.data["hello"] = "hello"; // UNEXPECTEDLY WORKS this.data[2] = 2; } } export class Col

以下代码对我来说很奇怪

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]
,我得到一个错误,说
符号不能用作索引签名。

这对我来说也很奇怪,但这是预期的行为。Per:

索引签名参数类型必须为“字符串”或“数字”。如果您有一个带有字符串索引签名的类型,那么keyof T将是string | number(而不仅仅是string,因为在JavaScript中,您可以通过使用字符串(object[“42]”)或数字(object[42])访问对象属性)


关于使用符号作为索引类型:您不能在索引签名中使用
symbol
,因此
{[k:symbol]:any}
是无效的TypeScript。但是,您可以使用特定的符号值属性作为类型中的键,如在
私有数据中:{[symbol.iterator]?:any}={}。你的用例是什么?谢谢你的回答!但这仍然不能回答
this.data[2]=2私有数据:{[k:string]:any}={}。至于我的用例,它只是构建一个集合类来存储我的项目的数据。