首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套截齿定义

嵌套截齿定义
EN

Stack Overflow用户
提问于 2020-01-06 09:54:19
回答 1查看 942关注 0票数 2

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

代码语言:javascript
复制
interface IStudent {
    name: string;
    address: {
        lineOne: string;
        lineTwo: string;
    }
}

const getAddressLineOne = (student: Pick<IStudent, 'address'>) => student.address.lineOne;

对于函数的定义,我只关心选择addressaddress部分,但据我所知,Pick只允许我深入一个层次,而不是进一步说明我的意思。

有没有办法用打字本来做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-06 10:25:03

您可以创建自己的NestedPick类型:

代码语言:javascript
复制
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看起来像:

代码语言:javascript
复制
const getAddressLineOne = (student: NestedPick<IStudent, ['address', 'lineOne']>) =>
  student.address.lineOne;

// Test
declare const student: IStudent
const res = getAddressLineOne(student) // string

间接地,您可以缩小getAddressLineOne函数参数:

代码语言:javascript
复制
const getAddressLineOne2 = (address: Pick<IStudent["address"], "lineOne">) => address.lineOne;

代码样本

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59609924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档