Typescript 嵌套拾取定义

Typescript 嵌套拾取定义,typescript,Typescript,如果我有一个与嵌入式对象的接口,例如: 接口是学生{ 名称:字符串; 地址:{ 第一行:字符串; 第二行:字符串; } } const getAddressLineOne=(学生:选择)=>student.address.lineOne; 对于函数的定义,我只关心选择address的lineOne部分,但据我所知,pick只允许我深入一层,而不是进一步说明我的意思 有没有办法用typescript实现这一点?您可以创建自己的NestedPick类型: type NestedPick<T,

如果我有一个与嵌入式对象的接口,例如:

接口是学生{
名称:字符串;
地址:{
第一行:字符串;
第二行:字符串;
}
}
const getAddressLineOne=(学生:选择)=>student.address.lineOne;
对于函数的定义,我只关心选择
address
lineOne
部分,但据我所知,
pick
只允许我深入一层,而不是进一步说明我的意思


有没有办法用typescript实现这一点?

您可以创建自己的
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 getAddressLineOne2 = (address: Pick<IStudent["address"], "lineOne">) => address.lineOne;
const getAddressLineOne 2=(地址:Pick)=>address.lineOne;

我正在努力使
NestedPick
能够计算出正确的类型;例如,在
getAddressLineOne
中,返回类型是
NestedPick
。关于如何将其计算为
string
?@OliverRadini更新了
NestedPick
类型并检查对象!
const getAddressLineOne2 = (address: Pick<IStudent["address"], "lineOne">) => address.lineOne;