/**
* @license
* Copyright 2022-2026 Matter.js Authors
* SPDX-License-Identifier: Apache-2.0
*/
export type Properties = {
[key: string]: any;
};
/** Merges two types into one. */
export type Merge = {
[K in keyof A as K extends keyof B ? never : K]: A[K];
} & B;
export declare function Merge(a: A, b: B): Merge;
/** Type that represents a class constructor of a defined type or extend of it */
export type ClassExtends = {
new (...args: any[]): C;
};
/** Merge an array of objects into one. Currently assumes unique elements */
export type MergeAll = T extends [infer O extends Properties | undefined, ...infer R] ? O extends undefined ? MergeAll : O & MergeAll : T extends [] ? {} : never;
export declare function MergeAll(...objects: readonly [...T]): MergeAll;
/** Pluck an item from an array of objects if present */
export type Pluck = T extends [infer O, ...infer R] ? K extends keyof O ? [O[K], ...Pluck] : Pluck : T extends [] ? T : never;
export declare function Pluck(key: K, ...objects: readonly [...T]): Pluck;
/** Same as "a == undefined" but keeps the kids happy */
export declare function isNullish(a: any): boolean;
export type MakeMandatory = Exclude;
/** Create a branded type */
declare const __brand: unique symbol;
export type Brand = {
[__brand]: B;
};
export type Branded = T & Brand;
/**
* Make a type immutable.
*
* TODO - might need to extend depending type (e.g. doesn't handle Maps, Sets or Promises yet)
*
* Good reference implementation here:
*
* https://github.com/ts-essentials/ts-essentials/blob/master/lib/deep-readonly/index.ts
*/
export type Immutable = T extends (...args: any[]) => any ? T : T extends number ? T : T extends bigint ? T : T extends object ? {
readonly [K in keyof T]: Immutable;
} : T;
export type Mutable = T extends (...args: any[]) => any ? T : T extends number ? T : T extends bigint ? T : T extends object ? {
-readonly [K in keyof T]: Mutable;
} : T;
export declare function Mutable(value: Immutable): Mutable;
/**
* Convert a union to an interface.
*
* @see {@link https://stackoverflow.com/questions/50374908}
*/
export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
/**
* An identity type.
*
* You can't do:
*
* interface Foo extends typeof Bar {}
*
* But you can do:
*
* interface Foo extends Identity {}
*
* Without this type you'd have to do:
*
* interface FooType = typeof Bar;
* interface Foo extends FooType {};
*
* We have to do this a lot because we generate complex objects with detailed
* type information. When exported, TS (as of 5.2) inlines the type of these
* objects in declarations which makes our declarations massive. To avoid this
* we create an interface from the type then cast to the interface for export.
*/
export type Identity = T;
/**
* Tests whether the given variable is a real object and not an Array
* @param it The variable to test
* @returns true if it is Record
*/
export declare function isObject(it: unknown): it is Record;
export {};
//# sourceMappingURL=Type.d.ts.map