我试图在TypeScript中重写一个对象,其中值的类型取决于键.我希望TypeScript根据循环中的键缩小值的类型.以下是我的初始代码:
interface MyInterface {
name: string;
age: number;
hobbies?: string[];
}
const obj: MyInterface = {
name: 'John',
age: 23,
};
for (const key in obj) {
const value = obj[key];
// TypeScript treats key as string, and value as any
// I want it to treat value as string when key is 'name', number when key is 'age', etc.
}
在for...in
循环中,TypeScript将key
视为string
,将value
视为any
.然而,我希望它在key
等于'name'
时将value
视为string
,当key
等于'age'
时将number
视为key
,当key
等于'hobbies'
时将string[]
视为key
.
我试图通过创建一个笨拙的类型生成器函数来解决这个问题,该函数生成具有类型的键值对:
function* iterateObjectTyped<T extends MyInterface, K extends keyof T>(
obj: T
): Generator<[K, T[K]]> {
for (const key in obj) {
const value = obj[key as unknown as K];
yield [key as unknown as K, value];
}
}
for (const [key, value] of iterateObjectTyped(obj)) {
// now TypeScript treats key as "name" | "age" | "hobbies"
// and value as string | number | string[]
// however:
if (key === 'age') {
value;
// it still treats value as just string | number | string[]
// even though I expected the above check to narrow down the predictions
}
}
但这并不像预期的那样工作.尽管TypeScript现在在循环中将key
视为"name" | "age" | "hobbies"
,将value
视为string | number | string[]
,但它并没有根据if
判断中的key
来缩小value
的类型.
有没有一种方法可以在TypeScript中实现这一点?使用TypeScript 5.4.3.任何帮助将不胜感激.