मैंने कुछ कोड लिखे:
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
मुझे एक त्रुटि मिल रही है:
JSX तत्व प्रकार
Elem
का कोई निर्माण या कॉल हस्ताक्षर नहीं है
इसका क्या मतलब है?
मैंने कुछ कोड लिखे:
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
मुझे एक त्रुटि मिल रही है:
JSX तत्व प्रकार
Elem
का कोई निर्माण या कॉल हस्ताक्षर नहीं है
इसका क्या मतलब है?
जवाबों:
यह कंस्ट्रक्टरों और उदाहरणों के बीच एक भ्रम है ।
याद रखें कि जब आप प्रतिक्रिया में एक घटक लिखते हैं:
class Greeter extends React.Component<any, any> {
render() {
return <div>Hello, {this.props.whoToGreet}</div>;
}
}
आप इसे इस तरह से उपयोग करते हैं:
return <Greeter whoToGreet='world' />;
आप इसका इस तरह उपयोग नहीं करते हैं:
let Greet = new Greeter();
return <Greet whoToGreet='world' />;
पहले उदाहरण में, हम चारों ओर से गुजर रहे हैं Greeter
, हमारे घटक के लिए निर्माण कार्य । यही सही उपयोग है। दूसरे उदाहरण में, हम एक उदाहरण के आसपास से गुजर रहे हैं Greeter
। यह गलत है, और "ऑब्जेक्ट एक फ़ंक्शन नहीं है" जैसी त्रुटि के साथ रनटाइम में विफल हो जाएगा।
इस कोड के साथ समस्या
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
यह है कि यह एक उदाहरण की उम्मीद कर रहा है React.Component
। आप एक फ़ंक्शन चाहते हैं, जो इसके लिए एक कंस्ट्रक्टर लेता हैReact.Component
:
function renderGreeting(Elem: new() => React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
या इसी तरह:
function renderGreeting(Elem: typeof React.Component) {
return <span>Hello, <Elem />!</span>;
}
function renderGreeting(Elem: typeof React.Component)
ईएस 6 में कैसे लिखते हैं ?
function renderGreeting (Elem: new() => React.SFC<any>){...}
अगर ऐसा है तो हम इस तरह के एसएफसी के प्रकार की घोषणा क्यों करते हैं: const Hello:React.SFC<any> = (props) => <div>Hello World</div>
और नहीं:const Hello: new() =>React.SFC<any> = (props) => <div>Hello World</div>
export const BackNavigationTextWrapper = (WrappedComponent: typeof React.Component) => { const BackNavigationTextWrappedComponent = (props, { commonElements = {} }: any) => { return <WrappedComponent {...props} backLabel={commonElements.backLabel || 'Go back to reservation details'} /> }; BackNavigationTextWrappedComponent.type = WrappedComponent.type; return BackNavigationTextWrappedComponent; };
मुझे एक त्रुटि मिल रही है "संपत्ति 'प्रकार' टाइपो कंपोनेंट 'पर मौजूद नहीं है।"
यदि आप एक घटक वर्ग को एक पैरामीटर (बनाम एक उदाहरण) के रूप में लेना चाहते हैं, तो उपयोग करें React.ComponentClass
:
function renderGreeting(Elem: React.ComponentClass<any>) {
return <span>Hello, <Elem />!</span>;
}
React.ComponentType<any>
उन्हें शामिल करने के बजाय प्रकार का उपयोग करना चाहिए ।
जब मैं JSX से TSX में परिवर्तित कर रहा हूं और हम कुछ पुस्तकालयों को js / jsx के रूप में रखते हैं और दूसरों को ts / tsx में परिवर्तित करते हैं तो मैं TSX \ TS फ़ाइलों में js / jsx आयात विवरण बदलने के लिए लगभग हमेशा भूल जाता हूं
import * as ComponentName from "ComponentName";
सेवा
import ComponentName from "ComponentName";
यदि TSX से एक पुराने JSX (React.createClass) शैली के घटक को कॉल किया जाता है, तो उपयोग करें
var ComponentName = require("ComponentName")
tsconfig.json
) को कॉन्फ़िगर करते हैं तो इनपोर्ट स्टेटमेंट को बदलना आवश्यक नहीं है allowSyntheticDefaultImports
। देखें: typescriptlang.org/docs/handbook/compiler-options.html और चर्चा यहाँ: blog.jonasbandi.net/2016/10/...
यदि आप वास्तव में सहारा के बारे में परवाह नहीं करते हैं तो व्यापक संभव प्रकार है React.ReactType
।
यह देशी डोम तत्वों को स्ट्रिंग के रूप में पारित करने की अनुमति देगा। React.ReactType
इन सभी को शामिल किया गया:
renderGreeting('button');
renderGreeting(() => 'Hello, World!');
renderGreeting(class Foo extends React.Component {
render() {
return 'Hello, World!'
}
});
यदि आप सामग्री-यूआई का उपयोग कर रहे हैं , तो घटक की परिभाषा टाइप करें, जिसे टाइपस्क्रिप्ट द्वारा रेखांकित किया जा रहा है। सबसे अधिक संभावना है कि आप कुछ इस तरह देखेंगे
export { default } from './ComponentName';
त्रुटि को हल करने के लिए आपके पास 2 विकल्प हैं:
1. .default
जब JSX में घटक का उपयोग करें:
import ComponentName from './ComponentName'
const Component = () => <ComponentName.default />
2. उस घटक को नाम दें, जिसे आयात करते समय "डिफ़ॉल्ट" के रूप में निर्यात किया जा रहा है:
import { default as ComponentName } from './ComponentName'
const Component = () => <ComponentName />
इस तरह आपको .default
हर बार घटक का उपयोग करने की आवश्यकता नहीं है ।
निम्नलिखित ने मेरे लिए काम किया: https://github.com/microsoft/TypeScript/issues/28631#issuecomment-472606019 मैं इसे कुछ इस तरह से करके ठीक करता हूं:
const Component = (isFoo ? FooComponent : BarComponent) as React.ElementType
मेरे मामले में, मैं React.ReactNode
टाइप के बजाय एक कार्यात्मक घटक के लिए एक प्रकार के रूप में उपयोग कर रहा था React.FC
।
सटीक होने के लिए इस घटक में:
export const PropertiesList: React.FC = (props: any) => {
const list:string[] = [
' Consequat Phasellus sollicitudin.',
' Consequat Phasellus sollicitudin.',
'...'
]
return (
<List
header={<ListHeader heading="Properties List" />}
dataSource={list}
renderItem={(listItem, index) =>
<List.Item key={index}> {listItem } </List.Item>
}
/>
)
}
जैसा @Jthorpe से अवगत कराया गया, ComponentClass
केवल Component
या तो अनुमति देता है या PureComponent
नहीं FunctionComponent
।
यदि आप एक पास करने का प्रयास करते हैं FunctionComponent
, तो टाइपस्क्रिप्ट एक त्रुटि के समान होगा ...
Type '(props: myProps) => Element' provides no match for the signature 'new (props: myProps, context?: any): Component<myProps, any, any>'.
हालाँकि, आप दोनों मामलों के लिए अनुमति देने के ComponentType
बजाय उपयोग करके ComponentClass
। प्रतिक्रिया घोषणा फ़ाइल के अनुसार प्रकार को परिभाषित किया गया है ...
type ComponentType<P = {}> = ComponentClass<P, any> | FunctionComponent<P>
मेरे मामले में मैं new
टाइप परिभाषा के अंदर गायब था ।
some-js-component.d.ts
फ़ाइल:
import * as React from "react";
export default class SomeJSXComponent extends React.Component<any, any> {
new (props: any, context?: any)
}
और उस tsx
फ़ाइल के अंदर जहाँ मैं अप्रमाणित घटक को आयात करने की कोशिश कर रहा था:
import SomeJSXComponent from 'some-js-component'
const NewComp = ({ asdf }: NewProps) => <SomeJSXComponent withProps={asdf} />
रिएक्ट क्लास घटक की घोषणा करते समय, React.ComponentClass
इसके बजाय का उपयोग करें React.Component
यह ts त्रुटि को ठीक करेगा।
आप उपयोग कर सकते हैं
function renderGreeting(props: {Elem: React.Component<any, any>}) {
return <span>Hello, {props.Elem}!</span>;
}
हालाँकि, निम्न कार्य करता है?
function renderGreeting(Elem: React.ComponentType) {
const propsToPass = {one: 1, two: 2};
return <span>Hello, <Elem {...propsToPass} />!</span>;
}
@types/react
उनका उपयोग कर रहे हैं, तो इसका उपयोग करना सबसे आसान हैfunction RenderGreeting(Elem: React.ComponentType) { ... }