interface SomeThing {
a: string
b: string
c: string
}
const fields: Partial<Record<keyof SomeThing, boolean>> = {
a: true,
b: false,
}
type ExtractFields<T, F> = {
[K in keyof F]-?: F[K] extends true ? K extends keyof T ? T[K] : never : never;
}
type Result = ExtractFields<SomeThing, typeof fields>
我的目标是
Result
:
type Result {
a: string
}
相反,它会导致:
type Result = {
a: never;
b: never;
c: never;
}
就像
F[K]
无法解析为 true
,即使在 true
中定义为 F[K] extends true
。
让我们逐步修复它。
首先让我们保留
fields
的类型:
const fields = {
a: true,
b: false,
} satisfies Partial<Record<keyof SomeThing, boolean>>
这给你:
type Result = {
a: string;
b: never;
}
现在让我们改进
ExtractFields
以仅包含映射为 true 的键。
type ExtractFields2<T, F> = {
[K in keyof F as F[K] extends true? K : never]-?: K extends keyof T ? T[K] : never;
}
type Result2 = ExtractFields2<SomeThing, typeof fields>
这给了你预期:
type Result2 = {
a: string;
}
完整代码:
interface SomeThing {
a: string
b: string
c: string
}
const fields = {
a: true,
b: false,
} satisfies Partial<Record<keyof SomeThing, boolean>>
type ExtractFields<T, F> = {
[K in keyof F]-?: F[K] extends true ? K extends keyof T ? T[K] : never : never;
}
type Result = ExtractFields<SomeThing, typeof fields>
type ExtractFields2<T, F> = {
[K in keyof F as F[K] extends true? K : never]-?: K extends keyof T ? T[K] : never;
}
type Result2 = ExtractFields2<SomeThing, typeof fields>