TypeScript types and utility functions for handling Web Annotations.

web-annotation-utils/src/ multiplicity-utils.ts
24 lines
867 B

  1. export type OneOrMore<T> = T | T[];
  2. export type ZeroOrMore<T> = undefined | null | T | T[];
  3. export type OneOrMoreIncluding<Other extends any, RequiredValue extends any> =
  4. | RequiredValue
  5. | [RequiredValue, ...Other[]]
  6. | [...Other[], RequiredValue];
  7. // | [Other, ...OneOrMoreIncluding<Other, RequiredValue>]; // FIXME TypeScript complains about the circular reference..
  8. // OnlyOne<T> extracts the T from a One/ZeroOrMore<T> type
  9. export type OnlyOne<T> = T extends (infer X)[] ? X : T;
  10. export function asArray<T>(value: ZeroOrMore<T>): T[] {
  11. if (Array.isArray(value)) return value;
  12. if (value === undefined || value === null) return [];
  13. return [value];
  14. }
  15. export function asSingleValue<T>(value: ZeroOrMore<T>): T | undefined {
  16. if (value instanceof Array) return value[0];
  17. if (value === undefined || value === null) return undefined;
  18. return value;
  19. }