typescript - 新类型,它是父类型上每个键的值的联合
问题描述
所以我想生成一个类型,即使用类型组合上的所有可能键合并所有可能值。很难说这个,所以最好表现出来。
所以这是我的例子
type A = {
page: string,
other: number,
}
type B = {
obj: {
something: string
}
page: string,
}
export type AllViews = {
a: A;
b: B;
};
export type View = keyof AllViews;
type KeysOfUnion<T> = T extends T ? keyof T : never;
type AllTypes = AllViews[View];
type AllTypeKeys = KeysOfUnion<AllTypes>;
你可以看到AllTypes
,是我的两种类型 A 和 B 的并集
而 myAllTypeKeys
是这两种类型之间所有可能键的联合。
所以这就是我的问题所在。我想要一种新类型,即两个对象的所有键的所有可能值。在这种情况下,类型应该是string | number | { something: string }
目前我能想到的唯一方法是非常手动。
type AType = AllViews['a'];
type AKeyType = keyof AllViews['a'];
type AValueType = AType[AKeyType];
type BType = AllViews['b'];
type BKeyType = keyof AllViews['b'];
type BValueType = BType[BKeyType];
type AllValues = AValueType | BValueType;
我的代码最终将在父类型上包含几十个这样的新类型,我不想为我添加的每个新键/值手动添加它。
解决方案
除非我误解了这个问题,否则您需要做的就是创建一个泛型类型:
type All<T> = T[keyof T]
然后将其与现有类型的结合使用,例如
type AllValues = All<A&B> // string | number | { something: string }
[回应评论更新]:
不必显式列出该A&B
部分需要一个额外的泛型类型:
type All2<T> = {[K in keyof T]: All<T[K]>}; // I suck at naming things
type AllValues = All<All2<AllViews>>; // string | number | { something: string }
推荐阅读
- c# - Unity - 我如何实例化资产?
- python - Python Flask API Restful
- angular - 在另一个模块使用此属性之前,如何使用指令添加属性?
- java - Hibernate Query 在使用 H2 和 HSQL DB 时返回重复的结果集
- java - 如何监控文本 java fx 中的打印持续时间?
- node.js - 无法将新节点添加到 Node-RED
- javascript - javascript暂停函数执行,直到触发事件
- r - 在其他列表中查找公式列表
- javascript - 离子打字稿中的 window.postMessage
- r - R:安装包“Frostarella/DSUR.noof”时出现问题