如何在 React Native 的无状态功能组件中扩展原生组件的 props TypeScript 接口?

Posted

技术标签:

【中文标题】如何在 React Native 的无状态功能组件中扩展原生组件的 props TypeScript 接口?【英文标题】:How to extend a native's component's props TypeScript interface in a stateless, functional component in React Native? 【发布时间】:2017-03-10 19:02:50 【问题描述】:

为了保持一致的样式,React Native 文档建议编写一个 <CustomText /> 文本组件来包装原生 <Text /> 组件。

虽然这很容易做到,但我无法使用 TypeScript 2 让 <CustomText /> 拥有来自 <Text /> 的所有道具,而无需重新声明它们。

这是我的组件:

import React from 'react';
import  Text  from 'react-native';


interface Props 
    children?: any


const CustomText: React.SFC<Props> = (props) => (
    <Text ...props>
        props.children
    </Text>
);

如果我尝试将它与&lt;CustomText numberOfLines=1 /&gt; 一起使用,则会导致错误

TS2339: Property 'numberOfLines' does not exist on type 'IntrinsicAttributes & Props'

react-native.d.ts,我看到有这个导出:

export interface TextProperties extends React.Props<TextProperties> 

    /**
     * Specifies should fonts scale to respect Text Size accessibility setting on ios.
     */
    allowFontScaling?: boolean

    /**
     * Line Break mode. Works only with numberOfLines.
     * clip is working only for iOS
     */
    lineBreakMode?: 'head' | 'middle' | 'tail' | 'clip'

    /**
     * Used to truncate the text with an elipsis after computing the text layout, including line wrapping, such that the total number of lines does not exceed this number.
     */
    numberOfLines?: number

    /**
     * Invoked on mount and layout changes with
     *
     * nativeEvent:  layout: x, y, width, height.
     */
    onLayout?: ( event: LayoutChangeEvent ) => void

    /**
     * This function is called on press.
     * Text intrinsically supports press handling with a default highlight state (which can be disabled with suppressHighlighting).
     */
    onPress?: () => void

    /**
     * @see https://facebook.github.io/react-native/docs/text.html#style
     */
    style?: TextStyle

    /**
     * Used to locate this view in end-to-end tests.
     */
    testID?: string

但我不确定如何扩展它以在我的组件的Props 接口中利用它。

【问题讨论】:

【参考方案1】:

你只需要让你的Props接口扩展TextProperties

interface Props extends TextProperties 
    children?: any


编辑

你需要先导入:

import  Text, TextProperties  from 'react-native';

【讨论】:

我试过了,但是 TS2304: Cannot find name 'TextProperties' 出错了。甚至尝试添加&lt;reference path /&gt; 无济于事:( 检查我修改后的答案 试试import TextProps from 'react-native' 而不是TextProperties

以上是关于如何在 React Native 的无状态功能组件中扩展原生组件的 props TypeScript 接口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 TypeScript 的 React-Native 中使用 styled-component 键入无状态功能组件?

如果没有 shouldComponentUpdate,React 0.14 的无状态组件将如何提供性能改进?

React Native - 处理来自子组件(自定义组件)的父状态,而不在父组件中添加功能

React Native - 无法对未安装的组件执行 React 状态更新,使用Effect 清理功能

react-native中如何更新两个独立组件的状态?

如何在 React-Native 中获取其他组件的状态值?