typescript - 有没有办法在 Typescript 中制作对象的子集?
问题描述
我有一个Item
这样定义的对象
type Item = {
amount: number;
warnLimit: number;
prettyName: string
}
当值是某种类型时,我正在尝试创建一个具有键值的类型:
{
amount: number;
warnLimit: number
} // ItemOnly<number>
但相反,我得到
{
amount: number;
warnLimit: number;
prettyName: number
} // ItemOnly<number>
目前,我正在使用
type ItemOnly<T> = {
[key in keyof Item]?: T;
};
每当我需要转换时,Item
我都会这样做(item as any) as ItemOnly<number>
,但这仍然允许我访问类型不正确的密钥。
我不知道这是否可能,因为我是更复杂的打字稿的新手。
解决方案
根据您所写的内容,我假设您想Item
根据谓词选择属性的子集。在这种情况下,谓词是:给我值为 a 的属性number
。
换句话说,我们想做Pick<Item, 'amount' | 'warnLimit'>
但不硬编码选择的属性名称。
让我们首先创建一个按属性值定位属性的助手。
type PropertyOfValue<T, V> = {
[K in keyof T]-?: T[K] extends V
? K
: never
}[keyof T];
我们现在可以选择 的数值属性Item
:
type ItemOnlyNumber = Pick<Item, PropertyOfValue<Item, number>>;
但我们不必将自己限制在 type 的值上number
。ItemOnly<T>
我们可以创建一个通过任何值选择属性的泛型类型。
type ItemOnly<T> = Pick<Item, PropertyOfValue<Item, T>>;
const item: ItemOnly<number> = {
amount: 5,
warnLimit: 10
}
希望有帮助!
推荐阅读
- java - 在 pdfbox 中添加对评论的回复
- jquery - 将带有文本框的引导下拉菜单调整为内容宽度
- git - 检查分支是否已经合并到远程的 master 或 dev 分支
- python - 使用python的mongodb查询
- sql - Spark sql中缺少已注册的临时表
- ios - 如何在 iOS Swift 中设置特定索引的集合视图单元格?
- javascript - 无法为表格制作固定标题
- javascript - 玩 babel v7 抛出错误
- unit-testing - 为什么junit说我的测试方法应该没有参数?
- javascript - 如何使用图表 JS 修复双甜甜圈图中的工具提示位置问题?