0

以下代码对我来说似乎很奇怪......

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不能用作索引签名。

4

1 回答 1

0

这对我来说也很奇怪,但这是预期的行为。根据文档

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

于 2021-01-24T05:28:03.430 回答