【问题标题】:Typescript Errors while converting a React project转换 React 项目时出现打字稿错误
【发布时间】:2016-01-13 23:41:30
【问题描述】:

这是特定于我从标准 ES2015 转换为 Typescript 的 React 应用程序。在我的 .tsx 文件(从常规 .js 文件转换而来)中,我遇到了一些我不知道如何解决的打字稿错误。

第一个是:error TS2339: Property 'propTypes' does not exist on type 'typeof App'.

这适用于:

App.propTypes = {
  actions: PropTypes.object.isRequired,
  fuelSavingsAppState: PropTypes.object.isRequired
};

我尝试在定义 App 的代码之上创建一个接口,例如:

interface App {
    propTypes?: any;
}

但这没有任何效果。显然我是 Typescript 的新手,所以我错过了什么?

另一个错误是:

error TS2605: JSX element type 'Element' is not a constructor function for JSX elements.
  Property 'render' is missing in type 'Element'

这适用于:

{settings.necessaryDataIsProvidedToCalculateSavings ? <FuelSavingsResults savings={settings.savings} /> : null}

错误具体指的是关于&lt;FuelSavingsResults的位

完全不知道从哪里开始。欢迎提出任何建议。


如果有帮助,FuelSavingsResults 的定义开头如下:

let FuelSavingsResults = (props) => {
    let savingsExist = NumberFormatter.scrubFormatting(props.savings.monthly) > 0;
    let savingsClass = savingsExist ? 'savings' : 'loss';
    let resultLabel = savingsExist ? 'Savings' : 'Loss';

然后有一个常规的 React 渲染方法,但我认为这并不重要。

【问题讨论】:

    标签: javascript reactjs typescript


    【解决方案1】:

    错误 TS2339:“typeof App”类型上不存在属性“propTypes”。

    代替

    class App extends React.Component{
    }
    App.propTypes = {
      actions: PropTypes.object.isRequired,
      fuelSavingsAppState: PropTypes.object.isRequired
    };
    

    使用static 属性。

    class App extends React.Component{
        static propTypes = {
          actions: PropTypes.object.isRequired,
          fuelSavingsAppState: PropTypes.object.isRequired
        };
    }
    

    错误 TS2605:JSX 元素类型“元素”不是 JSX 元素的构造函数。 “元素”类型中缺少属性“渲染”

    这是编译器中的一个错误,现已修复:https://github.com/Microsoft/TypeScript/issues/6349 替代为props 提供类型注释。 ?

    【讨论】:

    • 这个 bug 最近才解决,这让我想知道 Typescript 真的可以与 React 一起使用。你怎么看?对 React 来说还是太“测试版”了吗?
    • @Stuart 我正在用它构建它:alm.tools 它的 beta 比 React 本身要少得多? 这些错误主要是 TypeScript 提供 更多帮助,否则 i>在运行前完全不存在并被忽略.
    【解决方案2】:

    真的需要 propTypes 吗?编译时不会接口检查 propTypes 在运行时检查什么?

    interface IApp{
      actions:any;
      fuelSavingsAppState: (props:any)=> void;
    }
    
    class App extends React.Component<IApp,{}>{
    }
    

    或者如果您使用的是哑组件

    const App = ({actions,  fuelSavingsAppState }:IApp):React.ReactElement<{}> => (
      <div>
       What Ever you want to do with the props 
      </div>
    )
    

    注意:如果您使用对象,请为其创建一个接口。就像现在给出的任何动作一样,理想情况下应该是一个界面。

    【讨论】:

    • 我是来自 Angular 2 的 React 新手。我可以说,在某些情况下,运行时检查肯定是不必要的,我应该说,甚至是至关重要的。服务中使用的许多辅助方法往往受益于运行时检查。我通常会检查参数以防止它们被滥用,从而防止调用堆栈中更深的错误。
    • 我尝试定义接口,它不会弹出错误,即使定义了错误的类型
    • TS 将在编译时提供类型检查,在运行时提供 PropTypes。
    猜你喜欢
    • 2019-12-15
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2018-08-12
    • 2022-01-19
    • 2019-04-24
    相关资源
    最近更新 更多