typescript - 嵌套拾取定义
问题描述
如果我有一个带有嵌入式对象的接口,例如:
interface IStudent {
name: string;
address: {
lineOne: string;
lineTwo: string;
}
}
const getAddressLineOne = (student: Pick<IStudent, 'address'>) => student.address.lineOne;
对于函数的定义,我真的只关心选择 的lineOne
部分address
,但据我了解,Pick
只允许我深入一层,而不是进一步说明我的意思。
有没有办法用打字稿做到这一点?
解决方案
您可以创建自己的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;
推荐阅读
- flutter - 我希望 SingleChildScrollView 保持固定
- c++ - 使用类成员作为所述类的 std::map 中的键
- java - 为什么我的视图在重新加载时会改变颜色?
- testing - @QuarkusTest 单元测试需要很长时间
- javascript - 如何将文档集合添加到firebase中新创建的文档中?
- java - InjectMock 不适用于 Quarkus 中 ApplicationScoped Bean 的 RestClient
- angular - 如何在角度组件中获取文档对象
- java - Mailchimp.execute 引发协议版本错误
- rest - 邮递员 OAuth 令牌请求有时会失败,有时会成功
- c# - 如果自定义控件的 Dependency Property 为 true,则执行按钮命令