不能使用带有情感 js 和 typescript 的样式组件的道具

Posted

技术标签:

【中文标题】不能使用带有情感 js 和 typescript 的样式组件的道具【英文标题】:Can't use props for styled components with emotion-js and typescript 【发布时间】:2021-03-30 20:25:45 【问题描述】:

这是我非常简单的组件:

import React,  ReactChild, ElementType  from 'react'
import styled from '@emotion/styled'

type WrapperPropsType = 
  size?: SizeType


type ButtonPropsType = 
  as?: ElementType<any>,
  size?: SizeType,
  children?: ReactChild


const Wrapper = styled.button<WrapperPropsType>((props: WrapperPropsType) => (
  fontSize: FontSize[props.size],
))

const Button = ( as, size, children : ButtonPropsType) => 
  return (
    <Wrapper as=as size=size>
         children 
    </Wrapper>
  )

我的.tsconfig


  "compilerOptions": 
    "types": ["node", "@emotion/react"],
    "declaration": true,
    "declarationDir": "build",
    "module": "esnext",
    "target": "es5",
    "sourceMap": true,
    "jsx": "preserve",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true
  ,
  "include": ["src/**/*"],
  "exclude": [
    "node_modules",
    "build",
    "src/**/*.test.tsx"
  ]

但在编译时出现下一个错误:

错误:src/components/Button/Button.tsx(18,30):语义错误 TS2339:属性“大小”不存在于类型“主题?:主题;作为?:元素类型; & Pick, "form" | ... 265 更多... | "onTransitionEndCapture"> & ...; '。

我做错了什么?感谢您的帮助

包版本: @emotion/react 版本:11.1.2 @emotion/styled 版本:11.0.0 typescript 版本:4.1.3

【问题讨论】:

【参考方案1】:

我通过将rollup-plugin-typescript2 替换为@rollup/plugin-typescript 设法解决了这个问题。代码中没有错误。

【讨论】:

【参考方案2】:

您在WrapperPropsType 中定义了size,但没有使用它。添加它,它会工作

const Button = ( as, size, children : ButtonPropsType & WrapperPropsType) => 

【讨论】:

我在 ButtonPropsType 中也有 size,所以它已经定义好了,不幸的是,添加 &amp; WrapperPropsType 并没有改变任何东西 检查您是否使用了正确的ButtonPropsType。因为 theme?: Theme; as?: ElementType; &amp; Pick&lt;DetailedhtmlProps&lt;ButtonHTMLAttributes, HTMLButtonElement&gt; as?: ElementType&lt;any&gt;, size?: SizeType, children?: ReactChild 不一样

以上是关于不能使用带有情感 js 和 typescript 的样式组件的道具的主要内容,如果未能解决你的问题,请参考以下文章

带有 knockout.js 和 ORM 的 TypeScript

如何在 Typescript 中使用道具在情感/样式样式组件之间共享样式

在带有 TypeScript 的 Next.js 中使用 getInitialProps

如何在带有 TypeScript 的 next.config.js 中使用 i18n 和 next/image?

typescript 使用任何带有typescript的ext JS库

为啥typescript不能直接引用第三方js库的全局变量?