使用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

