export type Awaitable = T | PromiseLike; export type Constructor = new (...arguments_: Arguments) => T; export type BindingTarget = Map | Record; export type ConditionalKeys = NonNullable<{ [Key in keyof Base]: Base[Key] extends Condition ? Key : never; }[keyof Base]>; export type PropertyName = ConditionalKeys & string; export type TypedBindingProperty = TTarget extends Map ? TValue extends TTypeRestriction ? K | undefined : never : PropertyName; export type ExtractTypeRestriction = T extends TypedBindingProperty ? TTypeRestriction : T extends PropertyName ? TTypeRestriction : never; export type PropertyType> = TTarget extends Map ? TValue | undefined : TTarget[TProperty] & ExtractTypeRestriction;