我有以下场景。
function foo<A extends object, B extends A>(
a: A,
b: Pick<B, Exclude<keyof B, keyof A>>
): B {
return undefined as any;
}
const r = foo<{ a: string }, { a: string; b: number }>({ a: "" }, { b: 2 });
我希望 b
成为一个对象,它只包含不在 a
中的键。但我也想在将它们合并在一起时获得结果对象的类型。
最佳答案
这可以通过使用 Exclude
来实现在键上,然后使用 Pick
创建最终对象类型在那些过滤后的键上:
function foo<A extends object, B extends A>(
a: A,
b: Pick<B, Exclude<keyof B, keyof A>>,
): B {
return undefined as any;
}
再解释一下:
type A = { a: string };
type B = { a: string; b: number };
// "b"
type FilteredProps = Exclude<keyof B, keyof A>;
// { b: number; }
type FinalType = Pick<B, FilteredProps>;
为什么Exclude<B, Pick<B, keyof A>>
的原因不工作是因为:
// { a: string; }
type PickedObject = Pick<B, keyof A>;
// never, because { a: string; b: number; } extends { a: string; }
type FinalType = Exclude<B, PickedObject>;
// for reference...
type Exclude<T, U> = T extends U ? never : T;
关于Typescript - 在参数中排除其他类型的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49707496/