打字稿扩展反应原生视图组件

Posted

技术标签:

【中文标题】打字稿扩展反应原生视图组件【英文标题】:Typescript extend react native View component 【发布时间】:2019-09-26 01:49:39 【问题描述】:

试图扩展 react-native View 组件。但是我在扩展 View 组件的 props 时遇到了问题。

这是我扩展Props的方法

import  StyleSheet, View, ViewStyle, ViewProps  from "react-native";
interface Props extends ViewProps 
  pb?: keyof Size | number;
  pt?: keyof Size | number;
  pv?: keyof Size | number;
  ph?: keyof Size | number;

这是我自定义的View 组件

class WrappedView extends Component<Props> 
  render() 
    const methods = ;
    let  style: attrStyles, children, pb, pt, pv, ph, ...rest  = this.props;
    let style = [attrStyles];
    // Shorthand prop styles
    let propStyles: ViewStyle = ;
    propStyles.paddingBottom = pb;
    propStyles.paddingTop = pt;
    propStyles.paddingVertical = pv;
    propStyles.paddingHorizontal = ph;
    style.push(propStyles);
    return (
      <View style=style ...rest ...this.state ...methods>
        children
      </View>
    );
  

当我尝试这样的测试时

const test = () => 
  return <WrappedView pb="large" width="100%" />;
;

我收到以下问题

Type ' pb: "large"; width: string; ' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<WrappedView> & Readonly<Props> & Readonly< children?: ReactNode; >'.
  Property 'width' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<WrappedView> & Readonly<Props> & Readonly< children?: ReactNode; >'.

【问题讨论】:

width 不是来自ViewProps 的道具。检查它here 啊,这太尴尬了,谢谢 【参考方案1】:

问题中的代码确实正确扩展了道具,而不是客户端错误。客户应阅读:

const test = () => 
  return <WrappedView pb="large" style=width:"100%" />;
;

【讨论】:

没错。请注意,您不需要像在问题中那样在 interface Props extends ViewProps 中重新定义 style 属性,因为样式已经是 ViewProp

以上是关于打字稿扩展反应原生视图组件的主要内容,如果未能解决你的问题,请参考以下文章

反应原生和打字稿多内联样式

为我的反应打字稿组件库生成/维护打字稿定义文件

自定义主题样式组件的打字稿

与打字稿反应:“历史”类型上不存在属性“推送”

用打字稿扩展反应风格道具

使用打字稿进行反应组件子类型检查