gpt4 book ai didi

带对象的 TypeScript 枚举

转载 作者:行者123 更新时间:2023-12-04 10:59:27 25 4
gpt4 key购买 nike

我正在尝试使用 Javarome's answera 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com