我试图创建一种类型,如果它们没有出现在另一种类型中,它们将递归地从一种类型中排除它们。例如,给出两种类型:
type TargetType = {a: true, b: {c: true, d: true}};
type InputType = {a: string, b: { c: boolean, d: number, e: string }, f: number};
我想创建一些通用类型PickMatchedKeys<T, U>
,以便
PickMatchedKeys<InputType, TargetType> = {a: string, b: { c: boolean, d: number }}
任何人都知道如何做到这一点?到目前为止,这是我最好的尝试:
type PickMatchedKeys<T, U> = {
[K in keyof T]: K extends keyof U ? PickMatchedKeys<T[K], U[K]> : never;
}
这项工作正常,但问题是f
中仍然存在键b.e
和PickMatchedKeys<InputType, TargetType>
,但类型为never
。理想情况下,这些键根本不会出现在最终类型中。
答案 0 :(得分:2)
为什么不这样:
T
您实际上不需要条件类型来将密钥限制为U
和T[K] extends object
共有的密钥,因为您可以只交叉密钥类型。你唯一需要做的就是确保不要深入研究原语;这就是type TestIt = PickMatchedKeys<InputType, TargetType>;
declare const z: TestIt;
z.a // string
z.b.c // boolean
z.b.d // number
z.b.e // error
z.f // error
部分的来源。您应该决定是否需要其他一些标准(例如,对数组做一些特殊的事情),但这是基本计划。
让我们来看看它:
getStarString
对我来说很好看。希望有所帮助;祝你好运!