在 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
}
}
我想用一个对象 属性 编写一个可重用的 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
}
}