如何在 Typescript 中将 ref prop 和 useRef 与 Lottie 文件一起使用?

Posted

技术标签:

【中文标题】如何在 Typescript 中将 ref prop 和 useRef 与 Lottie 文件一起使用?【英文标题】:How to use ref prop and useRef with Lottie files in Typescript? 【发布时间】:2021-05-20 22:00:17 【问题描述】:

编辑:我意识到这实际上正在工作,尽管有错误消息!所以我真的不需要实施帮助,但想知道如何摆脱错误。为什么即使代码正在运行,它也会给我一个错误,我应该改变什么来摆脱它(除非我应该忽略它,因为代码正在运行?)?当我正在学习 Typescript 以获得有关解释此类错误的解释时,这将非常有帮助。

我正在使用带有 React Native 的 Typescript,并且我希望只能播放到我的 lottie 文件的某个帧。这是我尝试过的:

const lottieRef = useRef<LottieView>();

useEffect(() => 
    if (lottieRef && lottieRef.current) 
      lottieRef.current.play(0, 120);
    
  );

  return (
    <LottieView
      ref=lottieRef
      source=SUCCESS.keepReading
      autoPlay
      loop=false
      style=styles.animationContainer
    />
  );

并且 ref 带有这条长错误消息的下划线:

No overload matches this call.
  Overload 1 of 2, '(props: AnimatedLottieViewProps | Readonly<AnimatedLottieViewProps>): AnimatedLottieView', gave the following error.
    Type 'MutableRefObject<AnimatedLottieView | undefined>' is not assignable to type 'LegacyRef<AnimatedLottieView> | undefined'.
      Type 'MutableRefObject<AnimatedLottieView | undefined>' is not assignable to type 'RefObject<AnimatedLottieView>'.
        Types of property 'current' are incompatible.
          Type 'AnimatedLottieView | undefined' is not assignable to type 'AnimatedLottieView | null'.
            Type 'undefined' is not assignable to type 'AnimatedLottieView | null'.
  Overload 2 of 2, '(props: AnimatedLottieViewProps, context: any): AnimatedLottieView', gave the following error.
    Type 'MutableRefObject<AnimatedLottieView | undefined>' is not assignable to type 'LegacyRef<AnimatedLottieView> | undefined'.ts(2769)
index.d.ts(143, 9): The expected type comes from property 'ref' which is declared here on type 'IntrinsicAttributes & IntrinsicClassAttributes<AnimatedLottieView> & Readonly<AnimatedLottieViewProps> & Readonly<...>'
index.d.ts(143, 9): The expected type comes from property 'ref' which is declared here on type 'IntrinsicAttributes & IntrinsicClassAttributes<AnimatedLottieView> & Readonly<AnimatedLottieViewProps> & Readonly<...>'

我是 typescript 和 lottie 文件的新手,所以如果这是一个明显的问题,我很抱歉!提前非常感谢!

【问题讨论】:

【参考方案1】:

不得不改成

const lottieRef = useRef<LottieView>(null);

这就解决了!

【讨论】:

【参考方案2】:

为什么即使代码正在运行,它也会给我一个错误

你有编译错误,它与你正确的运行时间无关(你的运行时间是 javascript 代码)。

例如:

const foo = (str: string) => console.log(str);
// compile error, but run time (JS) is correct
foo(6);

我应该改变什么来摆脱它

提供正确的类型,在useRef&lt;LottieView&gt;LottieView 不是引用类型,它是组件名称。

错误本身也提到了正确的类型是什么:

'AnimatedLottieView | null'
useRef<AnimatedLottieView>(null)

除非我应该忽略它,因为代码正在运行

你可能想回顾一下为什么你需要一个 TypeScript 开始,如果你发现它没用并且打字速度减慢你的速度而不是专注于影响,你可能不需要它(尤其是如果你是初学者) .

【讨论】:

顺便说一句,您和其他数十人在整个互联网上提出的解决方案并不能为我解决“错误”...【参考方案3】:

试一试:

const lottieRef = useRef<LottieView | null>(null);

【讨论】:

这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review

以上是关于如何在 Typescript 中将 ref prop 和 useRef 与 Lottie 文件一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Vue + TypeScript + Firebase:如何键入包含 firebase `User` 的`ref` 的对象?

如何使用 Cloud Functions (Typescript) 在 Firebase 实时数据库中的 .ref(/path) 之外创建新的父节点?

如何使用 Typescript 和 styled-components 创建 ref

如何使用 Vue3 和 Typescript 在 Quasar Framework 中定义 ref 方法的类型

如何在 TypeScript 中将 Set 转换为数组

如何在 TypeScript 中将字符串转换为数字?