reactjs - 带有样式组件的 TypeScript

标签 reactjs typescript styled-components

这里是 TypeScript 新手。我有一个使用 styled-components 的组件,我想将其转换为 TypeScript

import React from 'react'
import PropTypes from 'prop-types'
import styled from 'styled-components'


const propTypes = {
  name: PropTypes.string.isRequired // https://material.io/tools/icons/?style=baseline
}

const Icon = styled(({name, className, ...props}) => <i className={`material-icons ${className}`} {...props}>{name}</i>)`
  font-size: ${props => props.theme.sizeLarger};
`

Icon.propTypes = propTypes

export default Icon

我知道我可以用 interface 替换我的 propTypes

interface Props {
  name: string
}

但是,TypeScript 提示我没有声明 className。问题是,理想情况下,我希望使用 interface 作为开发人员可以提供的 Prop 的一种规范,而不必声明像 className 这样的 Prop 由 styled-components 等库注入(inject)的主题

如何正确地将此组件转换为 TypeScript?

最佳答案

import React from "react";
import styled from "styled-components";

interface Props {
  name: string;
  className?: string;
}

const NonStyledIcon: React.SFC<Props> = ({ name, className, ...props }) => (
  <i className={`material-icons ${className}`} {...props}>
    {name}
  </i>
);

const Icon = styled(NonStyledIcon)`
  font-size: ${props => props.theme.sizeLarger};
`;

export default Icon;

根据样式组件 TypeScript docs : 在定义组件时,您需要在 Props 接口(interface)中将 className 标记为可选

关于reactjs - 带有样式组件的 TypeScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55412662/

相关文章:

javascript - 要求未在脚本标记中定义

用于自定义主题样式组件的 typescript

javascript - React-leaflet 创建自定义组件

javascript - 如何阻止自定义模式扩展到屏幕之外

javascript - 如何同时映射两个数组?

javascript - 保存 React 组件

javascript - Azure Devops 小部件使用 azure-devops-extension-api 按项目获取所有 Pull 请求,仅获取一个结果

Angular ngModules 导入错误

typescript - 使用 TypeScript 在 create-react-app 中设置样式组件 babel 插件?

reactjs - 如何使用 styled-components 将 prop 传递给 Material-UI 组件