convert
Version:
The smallest & fastest library for really easy, totally type-safe unit conversions in TypeScript & JavaScript
98 lines (97 loc) • 2.71 kB
text/typescript
import type { BestKind, MeasureKind } from "../conversions/types.cjs";
import type { BestUnits as BestUnitsGenerated } from "../generated/best-units.cjs";
import type { UnitsByMeasure as UnitsByMeasureGenerated } from "../generated/types.cjs";
/**
* Get the units for a given measure.
* @public
*/
export type UnitsByMeasure<T extends MeasureKind> = T extends keyof UnitsByMeasureGenerated ? UnitsByMeasureGenerated[T] : never;
/** @public */
export type MeasureKindByUnit<T extends Unit> = {
[K in MeasureKind]: T extends UnitsByMeasureGenerated[K] ? K : never;
}[MeasureKind];
/**
* A type that gives all the units compatible with the same measure as a given unit.
* @public
*/
export type MeasuresByUnit<T extends Unit> = UnitsByMeasure<MeasureKindByUnit<T>> | (T extends 'm' ? Time : never) | (T extends Time ? 'm' : never);
/**
* A supported unit you can convert.
* @public
*/
export type Unit = UnitsByMeasure<MeasureKind>;
/**
* All possible best units for a given {@link BestKind | kind}.
* @public
*/
export type BestUnits<T extends BestKind = BestKind> = BestUnitsGenerated[T];
/**
* Get the best units for a given measure.
* @public
*/
export type BestUnitsForMeasure<M extends MeasureKind, K extends BestKind = BestKind> = BestUnitsForUnit<UnitsByMeasure<M>, K>;
/**
* Get the best units for a given unit.
* @public
*/
export type BestUnitsForUnit<U extends Unit, K extends BestKind = BestKind> = (Time | Length extends U ? Exclude<U, Time> : Time | 'm' extends U ? Exclude<U, 'm'> : U) & BestUnits<K>;
/**
* Valid angle units.
* @public
*/
export type Angle = UnitsByMeasure<MeasureKind.Angle>;
/**
* Valid area units.
* @public
*/
export type Area = UnitsByMeasure<MeasureKind.Area>;
/**
* Valid data units.
* @public
*/
export type Data = UnitsByMeasure<MeasureKind.Data>;
/**
* Valid energy units.
* @public
*/
export type Energy = UnitsByMeasure<MeasureKind.Energy>;
/**
* Valid force units.
* @public
*/
export type Force = UnitsByMeasure<MeasureKind.Force>;
/**
* Valid length units.
* @public
*/
export type Length = UnitsByMeasure<MeasureKind.Length>;
/**
* Valid mass units.
* @public
*/
export type Mass = UnitsByMeasure<MeasureKind.Mass>;
/**
* Valid power units.
* @public
*/
export type Power = UnitsByMeasure<MeasureKind.Power>;
/**
* Valid pressure units.
* @public
*/
export type Pressure = UnitsByMeasure<MeasureKind.Pressure>;
/**
* Valid temperature units.
* @public
*/
export type Temperature = UnitsByMeasure<MeasureKind.Temperature>;
/**
* Valid time units.
* @public
*/
export type Time = UnitsByMeasure<MeasureKind.Time>;
/**
* Valid volume units.
* @public
*/
export type Volume = UnitsByMeasure<MeasureKind.Volume>;