【ts】for in对象时,ts如何正确获取对应的属性值
第一种:for…in + keyof:适合需要遍历对象属性键并动态访问值的场景。
- keyof typeof obj是ts的类型操作符,用于获取对象obj的所有属性键的联合类型(“name” | “age” | “city”)
- 通过obj[key keyof typeof obj],ts知道key是合法的属性名,从而允许安全的访问属性值
const obj = {name: "Alice",age: 25,city: "New York"
};for (const key in obj) {// key 是属性名(字符串类型)const value = obj[key as keyof typeof obj]; // 通过 key 获取属性值console.log(key, value);
}
- 过滤原型链属性:
for in会过滤obj自身的可枚举属性和原型链上的可枚举属性;如果只想获取obj自身的属性,可以使用obj.hasOwnProperty()过滤
for(const key in obj) {if(obj.hasOwnProperty(key)) {const value = obj[key as keyof typeof obj]console.log(value)}
}
另一种写法
interface Person {name: string;age: number;city: string;
}const obj: Person = {name: "Alice",age: 25,city: "New York"
};for (const key in obj) {if (obj.hasOwnProperty(key)) {const value = obj[key as keyof Person]; // 明确 key 的类型console.log(`${key}: ${value}`);}
}
第二种:Object.entries()
如果不需要遍历原型链的属性,可以用更为现代和类型安全的方式:Object.entries()
Object.entries(obj).forEach([key, value] {console.log(key, value)
})