useAnimatedGestureHandler onStart 方法正确的上下文参数类型

And*_*ans 6 generics typescript react-native react-native-reanimated react-native-gesture-handler

TL;DR 有谁有任何例子, useAnimatedGestureHandler 的正确泛型是什么?

问题:

我正在关注Reanimated 2 手势动画教程有这样一个例子:

//...
const onGestureEvent = 
useAnimatedGestureHandler({
  onStart: (_, ctx) => {
    ctx.offsetX = translateX.value
  },
  //...
})
//...
Run Code Online (Sandbox Code Playgroud)

我使用打字稿,当我复制打字稿中的示例时,我得到ctx参数(上下文)类型错误: Property 'offset' does not exist on type '{}'.在 onStart 声明中进行一些窥探后,我发现 GestureHandlers 的完整类型需要一个泛型<T, TContext extends Context>

//...
export interface GestureHandlers<T, TContext extends Context> {
  onStart?: Handler<T, TContext>;
  //...
}
Run Code Online (Sandbox Code Playgroud)

解决方法:

我可以通过简单地传递一个实用程序类型记录(这几乎与说“任何”相同)来解决这个问题,我不喜欢这样。

const onGestureEvent = useAnimatedGestureHandler<
    GestureEvent<PanGestureHandlerEventPayload>,
    Record<string, unknown>
>({
    onStart: (_, ctx) => {
    ctx.offsetX = translateX.value;
    },
    // onActive: () => {},
    // onEnd: () => {},
});
Run Code Online (Sandbox Code Playgroud)

问题:

有谁有任何例子, useAnimatedGestureHandler 的正确通用是什么?

小智 10

根据文档context它是“一个普通的 JS 对象,可用于存储某些状态”,“您可以读取和写入任何数据”。您只需自己定义状态的接口即可。

源存储库有一个示例项目演示了这一点。例如,这里这里是两个例子,它们定义了AnimatedGHContext作为泛型传递的类型。

因此,在您的情况下,您将定义并传递如下类型:

type AnimatedGHContext = {
  offsetX: number;
};
Run Code Online (Sandbox Code Playgroud)