在TypeScript中,可以使用索引类型和条件类型来从嵌套对象的属性中获取类型。下面是一个示例:
type DeepKeyOf<T> = T extends object ? {
[K in keyof T]: K | `${K & string}.${DeepKeyOf<T[K]> & string}`
}[keyof T] : never;
function getNestedType<T, K extends DeepKeyOf<T>>(obj: T, key: K): K extends `${infer P}.${infer R}` ? (P extends keyof T ? (T[P] extends object ? DeepKeyOf<T[P]> : never) : never) : (key extends keyof T ? T[key] : never) {
const keys = key.split('.') as (keyof T)[];
let result: any = obj;
for (const k of keys) {
result = result[k];
}
return result;
}
使用示例:
interface Person {
name: string;
age: number;
address: {
city: string;
postalCode: string;
};
}
const person: Person = {
name: "John",
age: 30,
address: {
city: "New York",
postalCode: "12345"
}
};
const name: string = getNestedType(person, "name"); // "John"
const city: string = getNestedType(person, "address.city"); // "New York"
const postalCode: string = getNestedType(person, "address.postalCode"); // "12345"
const invalidKey: never = getNestedType(person, "invalidKey"); // Error: Argument of type '"invalidKey"' is not assignable to parameter of type '"name" | "age" | "address" | "address.city" | "address.postalCode"'
在上面的示例中,我们定义了一个DeepKeyOf
类型,它可以递归地获取嵌套对象的属性键。然后,我们定义了一个getNestedType
函数,它接受一个对象和一个属性键,并返回该属性的类型。该函数使用了索引类型和条件类型来处理嵌套属性键的情况。
请注意,这只是一个简单的示例,可能无法处理所有复杂的情况。在实际使用中,您可能需要根据具体的需求进行适当的修改和扩展。
领取专属 10元无门槛券
手把手带您无忧上云