使用其他类型过滤类型的键

时间:2018-04-28 00:24:06

标签: typescript

我试图创建一种类型,如果它们没有出现在另一种类型中,它们将递归地从一种类型中排除它们。例如,给出两种类型:

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.ePickMatchedKeys<InputType, TargetType>,但类型为never。理想情况下,这些键根本不会出现在最终类型中。

1 个答案:

答案 0 :(得分:2)

为什么不这样:

T

您实际上不需要条件类型来将密钥限制为UT[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

对我来说很好看。希望有所帮助;祝你好运!