类型化函数是否可以递归访问对象属性



在typescript中有没有一种好的方法可以键入一个递归访问对象属性的函数?下面是一个深入两个层次的手工编码示例:

function deepProp<T, K extends keyof T>(obj: T, prop1: K, prop2: keyof T[K]) {
return obj[prop1][prop2];
}
// Example use
const obj = {
user: {
pets: [{
toys: [{
name: "Toughy",
price: 1999
}]
}]
}
} as const
deepProp(obj, "user", "pets");

但我正在寻找一种很好的方法,可以在deepProp函数中取任意数量的props,以便根据需要深入挖掘。我想这个函数的签名应该是function deepProp(obj, ...props) { }。有什么好方法可以做到这一点吗?谢谢

不可能有任意数量的键,但您可以根据需要制作类似于lodash的get的东西。

也可以以一种递归方式使用函数。

上述_.get的示例(其类型最多支持4个密钥(:

const obj = {
user: {
pets: [{
toys: [{
name: "Toughy",
price: 1999
}]
}]
}
} as const
const toy1 = _.get(obj, ["user", "pets", 0, "toys"]); // correct type
const toy2 = _.get(obj, ["user", "pets", 0, "toys", 0]); // any :(
const toy3 = _.get(_.get(obj, ["user", "pets", 0, "toys"]), [0]); // correct type :)

最新更新