使用 Typescript(TSX 文件)将道具传递给 React 中的子组件

Posted

技术标签:

【中文标题】使用 Typescript(TSX 文件)将道具传递给 React 中的子组件【英文标题】:Pass props to child component in React, with Typescript (TSX file) 【发布时间】:2017-01-31 11:39:37 【问题描述】:

我正在使用 VS2013 并将现有项目设置为使用 React (0.14) 和 Typescript (1.8.5)。我的 React 代码可以作为 JSX 文件正常工作。我的新 TSX 文件中有一个我无法弄清楚的错误。

我在树下粘贴到组件的每个道具上都有 30 个奇怪的错误 - 这些都是这样的:

类型“IntrinsicAttributes & IntrinsicClassAttributes> & & children?: Reac...”上不存在属性“nameOfProp”。

这是一个让 TypeScript 感到不安的示例代码。任何帮助将不胜感激,因为这是在生产环境中启动和运行 React 的最后障碍之一。注意:为了节省空间,我没有包含有关 App 状态的信息,但红线仅在子组件名称上(过滤器、名称、id、计数)

var App = React.createClass(
  render: function() 
    render (
      <FilterItem 
      filter=this.state.artifactFilter
      count=this.state.count
      id=this.state.id
      name=this.state.name
      />
    )
  
);
var FilterItem = React.createClass(
  render: function() 
    return (
      <span>this.props.name (this.props.count)</span>
  )

);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react-dom.min.js"></script>

【问题讨论】:

【参考方案1】:

React.createClass 的签名是:

function createClass<P, S>(spec: ComponentSpec<P, S>): ClassicComponentClass<P>;

通用的PS 定义了道具和状态。 编译器不知道它们的类型是什么,所以它使用你在错误中得到的类型的基数。

你可以这样做:

interface AppState 
    filter: string;
    count: number;
    id: string;
    name: string;

var App = React.createClass<, AppState>(...);

interface FilterItemProps 
    count: number;
    name: string;

var FilterItem = React.createClass<FilterItemProps, >(...);

如果您使用的是类:

class App extends React.Component<, AppState> 
    render() 
        ...
    

【讨论】:

非常感谢!我曾尝试过界面,但不正确。这现在有效。所以没有办法保持 prop 定义松散?即使我很高兴拥有非类型安全的 TSX 文件,我也必须始终进行接口声明? 您始终可以将any, any 用于T, S,但是您将失去类型安全性。在这种情况下,编译器无法推断出正确的类型。在我看来,使用类更容易、更具可读性并且更有意义,然后添加泛型也不觉得多余。

以上是关于使用 Typescript(TSX 文件)将道具传递给 React 中的子组件的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 属性“道具”不存在

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

将 onclick 函数作为参数传递给 react/typescript 中的另一个组件

缺少元素的“关键”道具。 (ReactJS 和 TypeScript)

如何在 React TypeScript 中实现 e 和 props?

配置 ESLint 以将 .ts 和 .tsx 解析为 Typescript,将 .js 和 .jsx 解析为 Ecmascript