styled-component 组件中的 props 没有类型

Posted

技术标签:

【中文标题】styled-component 组件中的 props 没有类型【英文标题】:Props in styled-component component have no typing 【发布时间】:2020-05-17 15:42:01 【问题描述】:

我正在使用 react-native + typescript + styled-component(安装了所有 @types/*),但 props 仍然没有在“组件”内输入

有什么问题?

我希望道具是props: MainThemeInterfaceprops: mode: string

// button.component.ts
import  FC  from 'react';
import styled from 'styled-components/native';

interface ButtonComponentProps 
  title: string;
  onPress: (event: GestureResponderEvent) => void;


const Button = styled.TouchableOpacity`
  border-radius: 5px;
  padding: 11px 16px;
  background: $props => props;
  align-self: flex-start;
`;

export const ButtonComponent: FC<ButtonComponentProps> = props => (
  <Button onPress=props.onPress>props.title</Button>
);
// styled.d.ts file
import 'styled-components/native';
import  MainThemeInterface  from './theme.model';

// and extend them!
declare module 'styled-components' 
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
  export interface DefaultTheme extends MainThemeInterface 

// theme.model.ts file
export MainThemeInterface 
   mode: string;

更新

我降级到"styled-components": "^3.4.9" 并且打字开始工作。版本^5.0.0似乎存在问题。

更新 2

问题在于项目设置。使用expo cli 重新创建项目后,问题消失了。

【问题讨论】:

你有没有试过将 props 接口传递给 Button 的 style 对象? const Button = styled.TouchableOpacity&lt;ButtonComponentProps&gt; @Emma 是的,但它无论如何都不起作用 你能用你的代码发布一个小提琴或codesandbox.io吗? 【参考方案1】:

我也有同样的问题。尝试替换

declare module 'styled-components' 
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
  export interface DefaultTheme extends MainThemeInterface 

declare module 'styled-components/native' 
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
  export interface DefaultTheme extends MainThemeInterface 

问题仍然存在。我无法使用 styled-components 和 typescript 为 react-native 实现主题。

【讨论】:

【参考方案2】:

只是为了扩展我的评论..您可以尝试像这样将道具接口传递给按钮的样式对象


const Button = styled.TouchableOpacity<ButtonComponentProps>`
  border-radius: 5px;
  padding: 11px 16px;
  background: $props => props;
  align-self: flex-start;
`;

或者

const Button = styled.TouchableOpacity< mode: string >`
  border-radius: 5px;
  padding: 11px 16px;
  background: $props => props;
  align-self: flex-start;
`;

【讨论】:

以上是关于styled-component 组件中的 props 没有类型的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 styled-components 将样式应用于 React Native 中的自定义组件?

styled-components - 为啥在组件样式之后注入全局样式?

styled-components:使用额外的样式扩展现有组件

使用 styled-components 在组件/元素之间共享样式

Styled-component 和 Material 组件(媒体查询)

styled-components不能覆盖antd组件样式?