在Typescript中,可以使用索引类型和条件类型来定义选择嵌套属性而不丢失类型函数。
首先,我们需要定义一个类型,表示嵌套属性的路径。可以使用字符串字面量类型来表示属性名,然后使用联合类型和递归类型来表示嵌套路径。例如:
type Path<T, K extends keyof T> = K extends string ? T[K] : never;
type NestedPath<T, P extends string> = P extends `${infer K}.${infer R}` ? Path<T, K> extends object ? `${K}.${NestedPath<Path<T, K>, R>}` : never : Path<T, P>;
上述代码中,Path<T, K>
表示从类型 T
中选择属性 K
的类型。NestedPath<T, P>
表示从类型 T
中选择嵌套路径 P
的类型。
接下来,我们可以定义一个函数,接受一个对象和一个嵌套路径,并返回对应的属性值。使用条件类型和索引访问操作符来实现:
function getNestedProperty<T, P extends string>(obj: T, path: P): NestedPath<T, P> {
const parts = path.split('.');
let result: any = obj;
for (const part of parts) {
result = result[part];
}
return result;
}
上述代码中,getNestedProperty
函数接受一个对象 obj
和一个嵌套路径 path
,然后使用 split
方法将路径拆分为属性名数组,然后使用循环逐级访问属性,最后返回对应的属性值。
使用示例:
interface User {
id: number;
name: string;
address: {
city: string;
street: string;
};
}
const user: User = {
id: 1,
name: 'John',
address: {
city: 'New York',
street: '123 ABC Street',
},
};
const cityName = getNestedProperty(user, 'address.city');
console.log(cityName); // Output: New York
在上述示例中,我们定义了一个 User
接口表示用户对象,然后创建了一个 user
对象。使用 getNestedProperty
函数获取了 user
对象中嵌套路径为 'address.city'
的属性值,并将其赋值给 cityName
变量。最后输出了 cityName
的值,即为 'New York'
。
推荐的腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云