- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Javarome's answer至 a previous TypeScript question关于如何在枚举中使用对象:
class Material {
public static readonly ACRYLIC = new Material(`ACRYLIC`, `AC`, `Acrylic`);
public static readonly ALUM = new Material(`ALUM`, `AL`, `Aluminum`);
public static readonly CORK = new Material(`CORK`, `CO`, `Cork`);
public static readonly FOAM = new Material(`FOAM`, `FO`, `Foam`);
// private to diallow creating other instances of this type.
private constructor(
public readonly key: string,
public readonly id: string,
public readonly name: string
) {}
public toString(): string {
return this.key;
}
}
不幸的是,当我尝试使用括号语法(因为它在 for-of
循环中)时,我在代码的后面遇到了一个问题:
const materials: string[] = [`ACRYLIC`, `FOAM`];
for (const materialKey of materialsArray) {
const material: Material = Material[materialKey];
// ...
}
这会弹出一个巨大的 TS 错误 [TS(7053)],并显示以下消息:
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'typeof Material'.
No index signature with a parameter of type 'string' was found on type 'typeof Material'.ts(7053)
我已经谷歌搜索了几个小时,但没有找到任何帮助。有什么方法可以使用括号语法来引用这个“枚举”吗?
最佳答案
这段代码的问题是:
const materials: string[] = [`ACRYLIC`, `FOAM`];
Material
的可能属性之间没有关系静态类和字符串列表。问题的关键是在类型中指定我们拥有的列表是一个仅允许的属性列表,其值为 Material
。类型。
可以通过Exclude来实现类型实用程序。看看下面的例子:
type MaterialKeys = Exclude<keyof typeof Material, 'prototype'>;
const materialsArray: MaterialKeys[] = [`ACRYLIC`, `FOAM`];
for (const materialKey of materialsArray) {
const material: Material = Material[materialKey];
// ...
}
更多信息:Exclude<keyof typeof Material, 'prototype'>;
将获取 Material
的所有 key 输入并从中排除 prototype
,因此我们将在结果中拥有所有静态字段,而这正是我们想要的。
关于带对象的 TypeScript 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58922565/
我是一名优秀的程序员,十分优秀!