Jom*_*mik 2 types object typescript
我有以下场景。
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 });
Run Code Online (Sandbox Code Playgroud)
我想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;
}
Run Code Online (Sandbox Code Playgroud)
只是为了进一步解释这一点:
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>;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3724 次 |
| 最近记录: |