// Project: https://github.com/kmagiera/react-native-reanimated // TypeScript Version: 2.8 declare module 'react-native-reanimated' { import { ComponentClass } from 'react'; import { ViewProps, TextProps, ImageProps, ScrollViewProps, StyleProp, ViewStyle, TextStyle, ImageStyle, } from 'react-native'; namespace Animated { class AnimatedNode { constructor( nodeConfig: object, inputNodes?: ReadonlyArray>, ); isNativelyInitialized(): boolean; /** * ' __value' is not available at runtime on AnimatedNode. It is * necessary to have some discriminating property on a type to know that * an AnimatedNode and AnimatedNode are not compatible types. */ ' __value': T; } class AnimatedClock extends AnimatedNode { constructor(); } export enum Extrapolate { EXTEND = 'extend', CLAMP = 'clamp', IDENTITY = 'identity', } interface InterpolationConfig { inputRange: ReadonlyArray>; outputRange: ReadonlyArray>; extrapolate?: Extrapolate; extrapolateLeft?: Extrapolate; extrapolateRight?: Extrapolate; } type Value = string | number | boolean; class AnimatedValue extends AnimatedNode { constructor(value?: T); setValue(value: Adaptable): void; interpolate(config: InterpolationConfig): AnimatedNode; } export type Mapping = { [key: string]: Mapping } | AnimatedValue; export type Adaptable = | T | AnimatedNode | ReadonlyArray>; type BinaryOperator = ( left: Adaptable, right: Adaptable ) => AnimatedNode; type UnaryOperator = (value: Adaptable) => AnimatedNode; type MultiOperator = ( a: Adaptable, b: Adaptable, ...others: Adaptable[] ) => AnimatedNode; export interface DecayState { finished: AnimatedValue; velocity: AnimatedValue; position: AnimatedValue; time: AnimatedValue; } export interface DecayConfig { deceleration: Adaptable; } export interface TimingState { finished: AnimatedValue; position: AnimatedValue; time: AnimatedValue; frameTime: AnimatedValue; } export type EasingFunction = (value: Adaptable) => AnimatedNode; export interface TimingConfig { toValue: Adaptable; duration: Adaptable; easing: EasingFunction; } export interface SpringState { finished: AnimatedValue; velocity: AnimatedValue; position: AnimatedValue; time: AnimatedValue; } export interface SpringConfig { damping: Adaptable; mass: Adaptable; stiffness: Adaptable; overshootClamping: Adaptable | boolean; restSpeedThreshold: Adaptable; restDisplacementThreshold: Adaptable; toValue: Adaptable; } type AnimateStyle = { [K in keyof S]: S[K] extends ReadonlyArray ? ReadonlyArray> : S[K] extends object ? AnimateStyle : | S[K] | AnimatedNode< // allow `number` where `string` normally is to support colors S[K] extends string ? S[K] | number : S[K] > }; type AnimateProps< S extends object, P extends { style?: StyleProp; } > = { [K in keyof P]: K extends 'style' ? StyleProp> : P[K] | AnimatedNode }; type CodeProps = { exec?: AnimatedNode children?: () => AnimatedNode }; // components export const View: ComponentClass>; export const Text: ComponentClass>; export const Image: ComponentClass>; export const ScrollView: ComponentClass< AnimateProps >; export const Code: ComponentClass; // classes export { AnimatedClock as Clock, AnimatedNode as Node, AnimatedValue as Value, }; // base operations export const add: MultiOperator; export const sub: MultiOperator; export const multiply: MultiOperator; export const divide: MultiOperator; export const pow: MultiOperator; export const modulo: MultiOperator; export const sqrt: UnaryOperator; export const sin: UnaryOperator; export const cos: UnaryOperator; export const exp: UnaryOperator; export const round: UnaryOperator; export const floor: UnaryOperator; export const ceil: UnaryOperator; export const lessThan: BinaryOperator; export const eq: BinaryOperator; export const greaterThan: BinaryOperator; export const lessOrEq: BinaryOperator; export const greaterOrEq: BinaryOperator; export const neq: BinaryOperator; export const and: MultiOperator; export const or: MultiOperator; export function defined(value: Adaptable): AnimatedNode<0 | 1>; export function not(value: Adaptable): AnimatedNode<0 | 1>; export function set( valueToBeUpdated: AnimatedValue, sourceNode: Adaptable, ): AnimatedNode; export function concat( a: AnimatedNode, b: AnimatedNode, ...others: AnimatedNode[], ): AnimatedNode; export function cond( conditionNode: Adaptable, ifNode: Adaptable, elseNode?: Adaptable, ): AnimatedNode; export function block( items: ReadonlyArray>, ): AnimatedNode; export function call( args: ReadonlyArray>, callback: (args: ReadonlyArray) => void, ): AnimatedNode<0>; export function debug( message: string, value: Adaptable, ): AnimatedNode; export function onChange( value: Adaptable, action: Adaptable, ): AnimatedNode; export function startClock(clock: AnimatedClock): AnimatedNode<0>; export function stopClock(clock: AnimatedClock): AnimatedNode<0>; export function clockRunning(clock: AnimatedClock): AnimatedNode<0 | 1>; // the return type for `event` is a lie, but it's the same lie that // react-native makes within Animated export function event( argMapping: ReadonlyArray, config?: {}, ): (...args: any[]) => void; // derived operations export function abs(value: Adaptable): AnimatedNode; export function acc(value: Adaptable): AnimatedNode; export function color( r: Adaptable, g: Adaptable, b: Adaptable, a?: Adaptable, ): AnimatedNode; export function diff(value: Adaptable): AnimatedNode; export function diffClamp( value: Adaptable, minVal: Adaptable, maxVal: Adaptable, ): AnimatedNode; export function interpolate( value: Adaptable, config: InterpolationConfig, ): AnimatedNode; export const max: BinaryOperator; export const min: BinaryOperator; // animations export function decay( clock: AnimatedClock, state: DecayState, config: DecayConfig, ): AnimatedNode; export function timing( clock: AnimatedClock, state: TimingState, config: TimingConfig, ): AnimatedNode; export function spring( clock: AnimatedClock, state: SpringState, config: SpringConfig, ): AnimatedNode; // configuration // `addWhitelistedNativeProps` will likely be removed soon, and so is // intentionally not exposed to TypeScript. If it is needed, it could be // uncommented here, or just use // `(Animated as any).addWhitelistedNativeProps({ myProp: true });` // addWhitelistedNativeProps(props: { [key: string]: true }): void; } export default Animated; interface EasingStatic { linear: Animated.EasingFunction; ease: Animated.EasingFunction; quad: Animated.EasingFunction; cubic: Animated.EasingFunction; poly(n: Animated.Adaptable): Animated.EasingFunction; sin: Animated.EasingFunction; circle: Animated.EasingFunction; exp: Animated.EasingFunction; elastic(bounciness?: Animated.Adaptable): Animated.EasingFunction; back(s?: Animated.Adaptable): Animated.EasingFunction; bounce: Animated.EasingFunction; bezier( x1: number, y1: number, x2: number, y2: number, ): Animated.EasingFunction; in(easing: Animated.EasingFunction): Animated.EasingFunction; out(easing: Animated.EasingFunction): Animated.EasingFunction; inOut(easing: Animated.EasingFunction): Animated.EasingFunction; } export const Easing: EasingStatic; }