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

使用Styled Components创建Mixin时出现「TypeError: Object is not a function」错误排查

关于Styled Components Mixin 触发「TypeError: Object is not a function」的原因解析

嘿,结合你使用的技术版本(尤其是styled-components 3.2.6和TypeScript 2.8.3),这个错误大概率是Mixin的写法不符合该版本styled-components的要求,或是TypeScript类型推断出了问题导致的。下面是几个最常见的诱因:

1. Mixin定义方式不对

在styled-components 3.x版本里,Mixin不能直接写成普通对象,必须是返回样式对象的函数,或者是模板字符串形式的样式片段。很多人容易犯的错是直接导出一个样式对象:

// ❌ 错误写法:直接返回对象
const myMixin = {
  padding: '1rem',
  border: '1px solid #eee'
};

// 使用时就会触发错误
const Button = styled.button`
  ${myMixin}
`;

正确的写法应该是这样的:

// ✅ 写法一:返回样式对象的函数
const myMixin = () => ({
  padding: '1rem',
  border: '1px solid #eee'
});

// ✅ 写法二:模板字符串形式的Mixin
const myMixin = `
  padding: 1rem;
  border: 1px solid #eee;
`;

3.x版本的styled-components在解析模板字符串里的Mixin时,只认这两种形式——如果直接传对象,它会尝试把对象当作函数去执行,自然就抛出「Object is not a function」了。

2. TypeScript类型适配问题

你用的TypeScript 2.8.3版本比较老,和styled-components 3.2.6的类型定义可能存在适配偏差。比如,当你定义Mixin函数时没有明确标注类型,TypeScript可能无法正确推断出这是一个函数,最终在运行时被当作普通对象处理。

解决办法是给Mixin明确加上类型标注:

import { CSSObject } from 'styled-components';

const myMixin = (): CSSObject => ({
  padding: '1rem',
  border: '1px solid #eee'
});

这样TypeScript能准确识别这是一个返回CSS样式对象的函数,避免类型推断错误引发的运行时问题。

3. 调用Mixin时忘记传参数

如果你的Mixin是带参数的,调用时忘记传参也会触发这个错误。举个例子:

// 带参数的Mixin
const myMixin = (size: string) => ({
  padding: size,
});

// ❌ 错误:直接传入函数本身,没有执行
const Button = styled.button`
  ${myMixin}
`;

正确的调用方式应该是执行函数并传入参数:

// ✅ 正确写法:执行Mixin函数并传参
const Button = styled.button`
  ${myMixin('1rem')}
`;

这种情况下,如果你直接把未执行的函数传给模板字符串,styled-components会尝试执行它,但因为缺少必要参数,内部处理就会出错,抛出类似的错误。

4. react-scripts-ts的配置限制

react-scripts-ts 2.15.1是基于create-react-app的TypeScript模板,它的Babel配置可能对styled-components的语法支持有一定限制。比如是否正确配置了babel-plugin-styled-components?虽然默认可能包含,但如果有自定义配置改动,可能导致Mixin的解析出现问题。

你可以检查package.json里是否包含这个插件,或者尝试把react-scripts-ts升级到兼容当前依赖的最新版本(不过升级前最好做好依赖备份,避免版本冲突)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:31:49