mirror of
https://github.com/sindresorhus/type-fest.git
synced 2025-12-08 19:25:05 +00:00
47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
import type {OmitIndexSignature} from './omit-index-signature';
|
|
import type {PickIndexSignature} from './pick-index-signature';
|
|
import type {EnforceOptional} from './enforce-optional';
|
|
|
|
// Merges two objects without worrying about index signatures.
|
|
type SimpleMerge<Destination, Source> = {
|
|
[Key in keyof Destination as Key extends keyof Source ? never : Key]: Destination[Key];
|
|
} & Source;
|
|
|
|
/**
|
|
Merge two types into a new type. Keys of the second type overrides keys of the first type.
|
|
|
|
@example
|
|
```
|
|
import type {Merge} from 'type-fest';
|
|
|
|
interface Foo {
|
|
[x: string]: unknown;
|
|
[x: number]: unknown;
|
|
foo: string;
|
|
bar: symbol;
|
|
}
|
|
|
|
type Bar = {
|
|
[x: number]: number;
|
|
[x: symbol]: unknown;
|
|
bar: Date;
|
|
baz: boolean;
|
|
};
|
|
|
|
export type FooBar = Merge<Foo, Bar>;
|
|
// => {
|
|
// [x: string]: unknown;
|
|
// [x: number]: number;
|
|
// [x: symbol]: unknown;
|
|
// foo: string;
|
|
// bar: Date;
|
|
// baz: boolean;
|
|
// }
|
|
```
|
|
|
|
@category Object
|
|
*/
|
|
export type Merge<Destination, Source> = EnforceOptional<
|
|
SimpleMerge<PickIndexSignature<Destination>, PickIndexSignature<Source>>
|
|
& SimpleMerge<OmitIndexSignature<Destination>, OmitIndexSignature<Source>>>;
|