为什么TypeScript编译器会抱怨在类型'Readonly' (props)上不存在属性'data'?
为什么TypeScript编译器会抱怨在类型'Readonly' (props)上不存在属性'data'?
我正在学习TypeScript,但是我遇到了以下错误:
在类型'Readonly<{}> & Readonly<{ children?: ReactNode; }>'上不存在属性'data'。 TS2339 let data = this.props.data as any; ^
尽管BigOGraphProps.data
被定义了,但为什么编译器会抱怨它不存在?我一定是漏掉了什么关键的东西。请注意,我将其转换为any
,因为我不想担心AreaChart的底层类型(至少现在不想,首先我想让这部分工作起来)。
import React from 'react'; import { AreaChart } from 'recharts'; type BigOGraphProps = { data: { n: number[], oLogNData: number[], oNData: number[], oNLogNData: number[], oNSq2Data: number[], o2SqNData: number[], oNInvData: number[], }; }; export default class BigOGraph extends React.Component { constructor(props: BigOGraphProps) { super(props); } render() { let leftMargin = 5; let data = this.props.data as any; return (); } }
为什么TypeScript编译器会抱怨在类型'readonly' (props)上不存在属性'data'?该问题的出现原因是因为使用了泛型类React.Component
,它将props类型作为其第一个参数,默认为any
。解决方法是将其更改为React.Component<BigOGraphProps>
。
在React中,我们经常使用React.Component
来创建组件。它是一个泛型类,可以接受props类型作为参数。然而,默认情况下,它的props类型被设置为any
,这意味着它可以接受任何类型的props。
然而,在某些情况下,我们希望限制组件的props类型,以提高代码的可读性和可维护性。为此,我们可以将props类型作为泛型参数传递给React.Component
。
在这个问题中,TypeScript编译器抱怨在类型'readonly' (props)上不存在属性'data'。这是因为在使用React.Component
创建组件时,props类型被默认设置为any
,而不是我们期望的BigOGraphProps
。
要解决这个问题,我们只需将React.Component
的泛型参数更改为我们期望的props类型BigOGraphProps
。这样,编译器将能够正确地识别并验证组件的props属性。
下面是修改后的代码示例:
class BigOGraph extends React.Component{ render() { return ( // 组件的渲染逻辑 ); } }
通过将React.Component
的泛型参数设置为BigOGraphProps
,我们解决了TypeScript编译器抱怨属性'data'不存在的问题。现在,编译器将能够正确地检查和验证组件的props属性,提供更好的类型安全性。
TypeScript编译器报错"属性'data'在类型'Readonly' (props)上不存在的原因是因为在Component类中将BigOGraphProps
传递给泛型参数,并删除了构造函数。解决方法是将构造函数重新添加到类中,并将BigOGraphProps
传递给泛型参数。
import React from 'react'; type BigOGraphProps = { data: { n: number[]; oLogNData: number[]; oNData: number[]; oNLogNData: number[]; oNSq2Data: number[]; o2SqNData: number[]; oNInvData: number[]; }; }; export default class BigOGraph extends React.Component{ constructor(props: BigOGraphProps) { super(props); } render() { let leftMargin = 5; let data = this.props.data as any; return ( ); } }
重新添加构造函数并将BigOGraphProps
传递给泛型参数后,TypeScript编译器不再报错。