首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在for in循环中丢失枚举类型信息

在for in循环中丢失枚举类型信息
EN

Stack Overflow用户
提问于 2019-07-01 09:04:44
回答 1查看 220关注 0票数 1

在下面的示例中,myColors的键是Color类型的。但是,在遍历myColor对象时,我很难保留这些信息。

代码语言:javascript
复制
enum Color {
  Red = 'RED',
  Green = 'GREEN',
}

type MyColors = {
  [C in Color]?: string;
}

const myColors: MyColors = {
  [Color.Red]: '#8B0000',
}

for (const [name, hex] of Object.entries(myColors)) {
  // name is of type string here instead of Color
}

使用常规的for in循环,或者Object.keys(myColors)也可以将枚举键转换为字符串。

在遍历对象的属性时,是否存在保留键类型的方法?如果不是,我如何断言循环中的nameColor类型的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-01 09:32:48

TypeScript对Object.entries的定义是重载的,但这两个重载都使用字符串作为键类型。来自lib/lib.es2017.object.d.ts

/** *返回包含属性和方法的对象* @param对象的可枚举属性的键/值数组。这可以是您创建的对象,也可以是现有的文档对象模型(DOM)对象。*/条目(o:{ s: string: t} ArrayLike):string,T;/** *返回一个包含属性和方法的对象* @param对象的可枚举属性的键/值数组。这可以是您创建的对象,也可以是现有的文档对象模型(DOM)对象。*/条目(o:{}):string,any;

我相信这是有充分理由的。:-)但是您可以定义您自己的不使用entriesstring

代码语言:javascript
复制
// Our `entries` function
function entries<T>(o: T): [keyof T, T[keyof T]][] {
    return Object.entries(o) as unknown as [keyof T, T[keyof T]][];
}

然后它起作用了:

代码语言:javascript
复制
for (const [name, hex] of entries(myColors)) {
  // type of `name` is `Color` now
}

更进一步,我发现如果我添加以下声明:

代码语言:javascript
复制
interface ObjectConstructor {
    /**
     * Returns an array of key/values of the enumerable properties of an object
     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
     */
    entries<T>(o: T): [keyof T, T[keyof T]][];
}

这样,您的原始代码就像您预期的那样工作:

代码语言:javascript
复制
for (const [name, hex] of Object.entries(myColors)) {
  // type of `name` is `Color` now
}

(我通过循环体中的const n: Color = name;,与真正的编译器,而不仅仅是操场进行了二次检查。TypeScript在没有声明的情况下抱怨它,但是对于声明它很高兴。)

但是,TypeScript问题列表中的一些问题使我认为定义可能会给您传递Object.entries的其他类型的东西带来麻烦,特别是这一个这句话。因此,您可能希望拥有单独的函数(这很可能会使JIT消失),并在相关的地方使用它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56832826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档