import { ModelConstructor } from '../../../model';
import { ConditionExpressionDefinitionChain, ConditionExpressionDefinitionChainTyped } from '../type/condition-expression-definition-chain';
/**
 * Use this method when accessing a top level attribute of a model with strict typing of the value in chained function
 *
 * ```typescript
 * @Model()
 * class Person{
 *
 *   @PartitionKeyUUID()
 *   id: string
 *   age: number
 * }
 *
 * store
 *  .scan()
 *  .where(attribute2(Person, 'age').equals(5))
 *  .exec()
 * ```
 *
 * When using the attribute2 we have type support for the equals (and all other condition functions) value,
 * it can only be number, because the type of age is number too, this only works when not using a custom mapper.
 * The downside of the strict typing is the model constructor parameter which is only required for typing reasons
 */
export declare function attribute2<T, K extends keyof T>(modelConstructor: ModelConstructor<T>, attributePath: K): ConditionExpressionDefinitionChainTyped<T, K>;
/**
 * Use this method when accessing a top level attribute of a model to have type checking of the attributePath
 */
export declare function attribute<T>(attributePath: keyof T): ConditionExpressionDefinitionChain;
/**
 * Use this method when accessing a nested attribute of a model
 */
export declare function attribute(attributePath: string): ConditionExpressionDefinitionChain;
