react-native-animatable
react-native-animatable copied to clipboard
How to use Animatable.View in Typescript
Code:
import * as Animatable from 'react-native-animatable';
const Connection: React.FC = () => {
const animatableRef = useRef<Animatable.View>(null);
// not working
// const animatableRef = useRef<Animatable.View | null>(null);
// const animatableRef = useRef<Animatable.View | null>();
// const animatableRef = useRef<Animatable.View>();
[...]
return (
<Animatable.View
ref={animatableRef}
animation="slideInDown"
style={{ zIndex: 10 }}
>
<Text>Say hello</Text>
</Animatable.View>
);
};
Error in ref property
No overload matches this call.
Overload 1 of 2, '(props: AnimatableProperties<ViewStyle> & ViewProps, context?: any): ClassicComponent<AnimatableProperties<ViewStyle> & ViewProps, any>', gave the following error.
O tipo 'RefObject<View>' não pode ser atribuído ao tipo 'string | ((instance: ClassicComponent<AnimatableProperties<ViewStyle> & ViewProps, any> | null) => void) | RefObject<...> | null | undefined'.
O tipo 'RefObject<View>' não pode ser atribuído ao tipo 'RefObject<ClassicComponent<AnimatableProperties<ViewStyle> & ViewProps, any>>'.
Type 'AnimatableComponent<ViewProps, ViewStyle>' is missing the following properties from type 'ClassicComponent<AnimatableProperties<ViewStyle> & ViewProps, any>': replaceState, isMounted, context, setState, and 4 more.
Overload 2 of 2, '(props: AnimatableProperties<ViewStyle> & ViewProps, context?: any): Component<AnimatableProperties<ViewStyle> & ViewProps, any, any>', gave the following error.
O tipo 'RefObject<View>' não pode ser atribuído ao tipo 'string | ((instance: Component<AnimatableProperties<ViewStyle> & ViewProps, any, any> | null) => void) | RefObject<Component<AnimatableProperties<...> & ViewProps, any, any>> | null | undefined'.
O tipo 'RefObject<View>' não pode ser atribuído ao tipo 'RefObject<Component<AnimatableProperties<ViewStyle> & ViewProps, any, any>>'.
Type 'AnimatableComponent<ViewProps, ViewStyle>' is missing the following properties from type 'Component<AnimatableProperties<ViewStyle> & ViewProps, any, any>': context, setState, forceUpdate, render, and 2 more.ts(2769)
index.d.ts(145, 9): The expected type comes from property 'ref' which is declared here on type 'IntrinsicAttributes & IntrinsicClassAttributes<ClassicComponent<AnimatableProperties<ViewStyle> & ViewProps, any>> & Readonly<...> & Readonly<...>'
index.d.ts(145, 9): The expected type comes from property 'ref' which is declared here on type 'IntrinsicAttributes & IntrinsicClassAttributes<Component<AnimatableProperties<ViewStyle> & ViewProps, any, any>> & Readonly<...> & Readonly<...>'
I also came across this issue.
I removed the type and it works
const Connection: React.FC = () => {
const animatableRef = useRef(null);
return (
<Animatable.View
ref={animatableRef}
animation="slideInDown"
style={{ zIndex: 10 }}
>
<Text>Say hello</Text>
</Animatable.View>
);
}
I have faith in TypeScript's type inference that I don't need to explicitly define the type.
Edit
Completely ignore me, it just returns a RefType<any>
or something along those lines. I was wrong about the type inference!
Not sure if its the best solution, but I find the following works well:
const animatableRef = useRef<Animatable.View & View>(null);
Awesome, it worked @toughdeveloper!
In theory, it doesn't have to be necessary, does it?
Animatable.View returns or must reference a View Props:
export type View = AnimatableComponent <ViewProperties, ViewStyle>;
Or am I wrong?
@toughdeveloper solution worked for me.
However, when using it with custom components doesn't seem to work. I am trying to use it with react-native-fast-image
anyone know how I should be doing it?
const AnimatedImage = Animatable.createAnimatableComponent(FastImage);
const imageRef = React.useRef<typeof AnimatedImage>(null);
No overload matches this call.
Overload 1 of 2, '(props: AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, context?: any): ClassicComponent<AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, any>', gave the following error.
Type 'RefObject<AnimatableComponent<FastImageProperties, StyleProp<ImageStyle>>>' is not assignable to type 'string | ((instance: ClassicComponent<AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, any> | null) => void) | RefObject<...> | null | undefined'.
Type 'RefObject<AnimatableComponent<FastImageProperties, StyleProp<ImageStyle>>>' is not assignable to type 'RefObject<ClassicComponent<AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, any>>'.
Type 'AnimatableComponent<FastImageProperties, StyleProp<ImageStyle>>' is missing the following properties from type 'ClassicComponent<AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, any>': replaceState, isMounted, context, setState, and 4 more.
Overload 2 of 2, '(props: AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, context?: any): Component<AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, any, any>', gave the following error.
Type 'RefObject<AnimatableComponent<FastImageProperties, StyleProp<ImageStyle>>>' is not assignable to type 'string | ((instance: Component<AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, any, any> | null) => void) | RefObject<...> | null | undefined'.
Type 'RefObject<AnimatableComponent<FastImageProperties, StyleProp<ImageStyle>>>' is not assignable to type 'RefObject<Component<AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, any, any>>'.
Type 'AnimatableComponent<FastImageProperties, StyleProp<ImageStyle>>' is missing the following properties from type 'Component<AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, any, any>': context, setState, forceUpdate, render, and 2 more.ts(2769)
index.d.ts(145, 9): The expected type comes from property 'ref' which is declared here on type 'IntrinsicAttributes & IntrinsicClassAttributes<ClassicComponent<AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, any>> & Readonly<...> & Readonly<...>'
index.d.ts(145, 9): The expected type comes from property 'ref' which is declared here on type 'IntrinsicAttributes & IntrinsicClassAttributes<Component<AnimatableProperties<StyleProp<ImageStyle>> & FastImageProperties, any, any>> & Readonly<...> & Readonly<...>'
Same with using custom animations. Type error on the animation property.
<Animatable.Image
animation={{
from: { rotateY: '0deg' },
to: { rotateY: '359deg'}
}}
/>
Any update on this issue?
@toughdeveloper solution worked for me.
However, when using it with custom components doesn't seem to work. I am trying to use it with
react-native-fast-image
anyone know how I should be doing it?const AnimatedImage = Animatable.createAnimatableComponent(FastImage); const imageRef = React.useRef<typeof AnimatedImage>(null);
@ryoid I was having a similar issue, although I'm using react-native-reanimated
(version 2.2.0) and what I'm doing is a bit different. I managed to fix the error by casting the FastImage:
const AnimatedFastImage = Animated.createAnimatedComponent(
FastImage as ComponentClass<FastImageProps, unknown>
);
This is the error I was getting:
No overload matches this call.
Overload 1 of 2, '(component: ComponentClass<FastImageProps, any>, options?: Options<FastImageProps> | undefined): ComponentClass<AnimateProps<FastImageProps>, any>', gave the following error.
Argument of type 'ComponentType<FastImageProps> & FastImageStaticProperties' is not assignable to parameter of type 'ComponentClass<FastImageProps, any>'.
Type 'FunctionComponent<FastImageProps> & FastImageStaticProperties' is not assignable to type 'ComponentClass<FastImageProps, any>'.
Type 'FunctionComponent<FastImageProps> & FastImageStaticProperties' provides no match for the signature 'new (props: FastImageProps, context?: any): Component<FastImageProps, any, any>'.
Overload 2 of 2, '(component: FunctionComponent<FastImageProps>, options?: Options<FastImageProps> | undefined): FunctionComponent<AnimateProps<FastImageProps>>', gave the following error.
Argument of type 'ComponentType<FastImageProps> & FastImageStaticProperties' is not assignable to parameter of type 'FunctionComponent<FastImageProps>'.
Type 'ComponentClass<FastImageProps, any> & FastImageStaticProperties' is not assignable to type 'FunctionComponent<FastImageProps>'.
Type 'ComponentClass<FastImageProps, any> & FastImageStaticProperties' provides no match for the signature '(props: PropsWithChildren<FastImageProps>, context?: any): ReactElement<any, any> | null'.ts(2769)
So I cast the FastImage as the type that the parameter seemed to be expecting.
const OptionsAnimationRef = React.useRef<Animatable.View>();
Seems to be working but when I am trying
OptionsAnimationRef.current?.slideInLeft(300);
I have
Cannot invoke an object which is possibly 'undefined'.ts(2722)
Anyone knows how to fix this ?
I have been using type casting
with React.RefObject<T>
so far and it works.
const Comp = () => {
const animatableViewRef = useRef() as React.RefObject<Animatable.View & View>;
React.useEffect(() => {
if (
animatableViewRef.current &&
typeof animatableViewRef.current.bounceIn === 'function'
) {
animatableViewRef.current.bounceIn(1000);
}
}, []);
return <Animatable.View>{/* ... */}</Animatable.View>;
};
any updates?
I'm doing this and it's an ugly solution:
// from another file so I can reuse it
export type AnimatableViewRef = Animatable.View & View;
// on my component
const viewRef = useRef<AnimatableViewRef>(null);
useEffect(() => {
if (focused) {
viewRef.current?.zoomIn?.(1000);
} else {
viewRef.current?.zoomOut?.(1000);
}
}, [focused]);
We should have an AnimatableViewRef type properly typed.
In my case, there is no time that zoomIn
and zoomOut
are undefined
if the viewRef.current
is not undefined
, so we should not have to check zoomIn?.(n)
in runtime.
Also noticing the TS error that @dennisbouwpas is seeing. Using typescript 5.1.3.