我试图创建一个泛型类,其中属性类型必须是字符串或数字(因为它被用作索引)。
如果我尝试下面的代码,它会报错
TS2536:类型'T'不能用于索引类型'{}'.
export class GenericClass<T> {
public selectionMap: {[id: T]: boolean} = {};
public isSelected(id: T): boolean {
return !!this.selectionMap[id];
}
public toggleSelected(id: T): void {
if (this.isSelected(id)) {
delete this.selectionMap[id];
} else {
this.selectionMap[id] = true;
}
this.onChange();
}
}
在我的例子中,我总是知道T将是一个数字或字符串。只是不知道怎么写才能保证类型安全。
尝试如下:
export class GenericClass<T = string | number> {}
或
export class GenericClass<T extends string, number> {}
另外,确保用于调用类的类型是小写的string
和number
。更多信息请看这个博客。
为什么在这种情况下使用泛型?只使用你想要的类型,或者定义一个适合你需要的类型:
type Id = number | string;
export class GenericClass {
public selectionMap: {[id: Id]: boolean} = {};
public isSelected(id: Id): boolean {
return !!this.selectionMap[id];
}
public toggleSelected(id: Id): void {
if (this.isSelected(id)) {
delete this.selectionMap[id];
} else {
this.selectionMap[id] = true;
}
this.onChange();
}
}