You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Framer Motion+TypeScript实现类型安全的Variants与Custom属性?

解决Framer Motion + TypeScript的Variants类型安全问题

当前做法的问题

你直接定义variants对象的方式,TypeScript无法自动推断出变体名称的约束,也无法关联custom属性的类型与变体函数的参数类型,因此会出现:

  • initial/animate属性没有变体名称的自动补全提示
  • custom属性传入非数值类型时不会触发TypeScript报错

正确实现方案

要实现类型安全和自动补全,需要明确为variants指定Variants类型,并绑定custom参数的类型。具体步骤如下:

1. 导入必要的类型

从framer-motion导入Variants类型,用于约束变体的结构:

import { motion, Variants } from "framer-motion";

2. 定义Custom参数类型并约束Variants

先指定custom参数的类型(这里是number),再用Variants类型约束变体对象,确保变体函数的参数与custom类型完全匹配:

// 定义custom参数的类型
type CustomType = number;

// 用Variants约束变体,明确变体函数的参数类型
const variants: Variants<CustomType> = {
  initial: (custom: CustomType) => ({
    x: custom
  }),
  final: {
    x: 0,
    transition: {
      duration: 0.8
    }
  }
};

3. 使用motion组件

此时motion.div的initial/animate属性会自动补全"initial"和"final"选项,custom属性也会被强制要求传入number类型:

export default function App() {
  return (
    <motion.div
      className="App"
      variants={variants}
      custom={100} // 仅允许传入number类型,传入数组/对象会触发TypeScript报错
      initial="initial" // 自动补全可选的变体名称:"initial"|"final"
      animate="final"
    >
      <h1>Framer Motion</h1>
      <h2>Testing with typescript</h2>
    </motion.div>
  );
}

额外说明

如果你的变体不需要custom参数,可以省略泛型参数,直接使用const variants: Variants = { ... }。如果需要更复杂的custom类型(比如对象),只需修改CustomType的定义即可,TypeScript会自动同步约束custom属性和变体函数的参数。

内容的提问来源于stack exchange,提问作者saimarshadd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:22:27