在 Typescript 中定义静态可索引对象属性

Define static indexable object properties in Typescript

我想用一个对象 属性 编写一个可重用的 TypeScript class,该对象具有索引、命名的属性,可以在构造时定义并在以后通过它们的名称修改。这些命名属性可以是接口的键,我的目的是使用此接口静态检查 set 函数是否有不正确的键或迭代,例如:

class Container<T> {
    private attributes: {[name: keyof T]: any} = {};

    constructor(attributes: {[name: keyof T]: number}) {
        Object.entries(attributes).forEach(([name, value]) => {
            this.attributes[name] = {value: value, ...}; // 1 I want to add further properites to this object
        });
    }

    set(name: keyof T, value: number) {
        this.attributes[name].value = value; // 2
    }
}

但是上述方法不起作用,因为:

1: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'. No index signature with a parameter of type 'string' was found on type '{}'.

2: Type 'keyof T' cannot be used to index type '{}'

keyof 可以与泛型 classes 一起使用吗,我可以在 TypeScript 中实现类似的功能吗?我正在使用 TypeScript 3.9.4

要保留键的类型(因此它们是 keyof T,而不是变成 string),您可以使用 for .. in 循环:

class Container<T> {
    private attributes: {
        [name in keyof T]?: any
    } = {};

    constructor(attributes: {[name in keyof T]: number}) {
        for(let key in attributes) {
            let value = attributes[key];
            this.attributes[key] = { value: value, example: 7 };
        }
    }

    set(name: keyof T, value: number) {
        this.attributes[name].value = value; // 2
    }
}