在下面的示例中,myColors的键是Color类型的。但是,在遍历myColor对象时,我很难保留这些信息。
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)也可以将枚举键转换为字符串。
在遍历对象的属性时,是否存在保留键类型的方法?如果不是,我如何断言循环中的name是Color类型的
发布于 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;
我相信这是有充分理由的。:-)但是您可以定义您自己的不使用entries的string
// 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]][];
}然后它起作用了:
for (const [name, hex] of entries(myColors)) {
// type of `name` is `Color` now
}更进一步,我发现如果我添加以下声明:
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]][];
}这样,您的原始代码就像您预期的那样工作:
for (const [name, hex] of Object.entries(myColors)) {
// type of `name` is `Color` now
}(我通过循环体中的const n: Color = name;,与真正的编译器,而不仅仅是操场进行了二次检查。TypeScript在没有声明的情况下抱怨它,但是对于声明它很高兴。)
但是,TypeScript问题列表中的一些问题使我认为定义可能会给您传递Object.entries的其他类型的东西带来麻烦,特别是这一个和这句话。因此,您可能希望拥有单独的函数(这很可能会使JIT消失),并在相关的地方使用它。
https://stackoverflow.com/questions/56832826
复制相似问题