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

TypeScript中如何在@emotion/styled组件间共享带props的样式

正确实现代码

import styled from "@emotion/styled";
import { css } from "@emotion/react";

// 1. 先定义公共样式接收的props类型
interface InputStyleProps {
  invalid?: boolean;
}

// 2. 给css函数显式传入泛型参数,声明该样式块接收的props类型
const InputStyling = css<InputStyleProps>`
  width: 100%;
  border-style: solid;
  /* 注意:如果直接用CSS颜色名需要加引号,若是导入的主题变量可直接使用 */
  border-color: ${props => props.invalid ? '#f00' : '#00f'};
`;

// 3. styled组件直接复用同一个props类型即可,类型会自动匹配
export const BaseInput = styled.input<InputStyleProps>`
  ${InputStyling}
`;

export const BaseTextarea = styled.textarea<InputStyleProps>`
  ${InputStyling}
`;

核心修改说明

报错的核心原因是:css函数无法自动识别你在插值函数内声明的props类型,也无法和后续styled组件定义的props做自动匹配,导致TS认为二者类型不兼容,触发重载匹配失败错误。
你之前只给styled组件声明了props类型,但没有给css创建的公共样式块声明接收的props类型,所以就算定义了interface还是会报错。

如果需要叠加其他公共样式(比如你提到的resetInputCss),只需要给对应的css块也加上相同的泛型声明即可,组合使用时类型会自动校验匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:18:03