type Merge < M , N > = Omit < M , Extract < keyof M , keyof N > > & N ; type ConstructorParameters < T > = T extends new ( ... args ) => any ? U : never ; type MapConstructionOptions = NonNullable < ConstructorParameters < typeof mapkit . Map > [ 1 ] > ; type MarkerConstructionOptions = NonNullable < ConstructorParameters < typeof mapkit . MarkerAnnotation > [ 1 ] > ; type PaddingConstructorOptions = NonNullable < ConstructorParameters < typeof mapkit . Padding > [ 0 ] > ; export type NumberTuple = [ number , number ] ; export type Rect = [ number , number , number , number ] ; export type PaddingType = number | PaddingConstructorOptions ; export type RegionType = { latitude : number ; longitude : number ; latitudeSpan : number ; longitudeSpan : number ; } ; export type ImageUrl = { '1' : string ; '2' ? : string ; '3' ? : string ; } ; export const createPadding = ( padding ) => { return new mapkit . Padding ( typeof padding === 'number' ? { top : padding , right : padding , bottom : padding , left : padding , } : padding ) ; } ; export const createCoordinate = ( latitude , longitude ) => { return new mapkit . Coordinate ( latitude , longitude ) ; } ; export const createCoordinateSpan = ( latitudeDelta , longitudeDelta ) => { return new mapkit . CoordinateSpan ( latitudeDelta , longitudeDelta ) ; } ; export const createCoordinateRegionFromValues = ( region ) => { return createCoordinateRegion ( createCoordinate ( region . latitude , region . longitude ) , createCoordinateSpan ( region . latitudeSpan , region . longitudeSpan ) ) ; } ; export const createCoordinateRegion = ( center , span ) => { return new mapkit . CoordinateRegion ( center , span ) ; } ; export const createMapPoint = ( x , y ) => { return new mapkit . MapPoint ( x , y ) ; } ; export const createMapRect = ( x , y , width , height ) => { return new mapkit . MapRect ( x , y , width , height ) ; } ; export type MapOptions = Merge < MapConstructionOptions , { visibleMapRect ? : Rect ; region ? : RegionType ; center ? : NumberTuple ; padding ? : PaddingType ; } > ; export const propsToMapConstructionOptions = ( { visibleMapRect , region , center , padding , ... options } ) => ( { visibleMapRect : visibleMapRect && createMapRect ( ... visibleMapRect ) , region : region && createCoordinateRegionFromValues ( region ) , center : center && createCoordinate ( ... center ) , padding : padding ? createPadding ( padding ) : createPadding ( 0 ) , ... options , } ) ; export type MarkerOptions = Merge < MarkerConstructionOptions , { padding ? : PaddingType ; } > ; export const propsToMarkerConstructionOptions = ( { padding , ... options } ) => { return { padding : padding ? createPadding ( padding ) : createPadding ( 0 ) , ... options , } ; } ;