如果我有一个与嵌入式对象的接口,如:
interface IStudent {
name: string;
address: {
lineOne: string;
lineTwo: string;
}
}
const getAddressLineOne = (student: Pick<IStudent, 'address'>) => student.address.lineOne;对于函数的定义,我只关心选择address的address部分,但据我所知,Pick只允许我深入一个层次,而不是进一步说明我的意思。
有没有办法用打字本来做这件事?
发布于 2020-01-06 10:25:03
您可以创建自己的NestedPick类型:
type NestedPick<T, K extends string[]> = T extends object ? {
[P in Extract<keyof T, K[0]>]: NestedPick<T[P], Tail<K>>
} : T
// get tail of tuple
type Tail<T extends any[]> = ((...args: T) => any) extends (head: any, ...tail: infer I) => any
? I : never还没有测试边缘案例,但这可能是一个很好的起点。然后,getAddressLineOne看起来像:
const getAddressLineOne = (student: NestedPick<IStudent, ['address', 'lineOne']>) =>
student.address.lineOne;
// Test
declare const student: IStudent
const res = getAddressLineOne(student) // string间接地,您可以缩小getAddressLineOne函数参数:
const getAddressLineOne2 = (address: Pick<IStudent["address"], "lineOne">) => address.lineOne;https://stackoverflow.com/questions/59609924
复制相似问题