আমি কিছু কোড লিখেছি:
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
আমি একটি ত্রুটি পাচ্ছি:
জেএসএক্স উপাদান ধরণের
Elem
কোনও নির্মাণ বা কল স্বাক্ষর নেই
এর মানে কী?
আমি কিছু কোড লিখেছি:
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
আমি একটি ত্রুটি পাচ্ছি:
জেএসএক্স উপাদান ধরণের
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)
ES6 তে লিখব ?
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>
এটি অন্তর্ভুক্ত করার পরিবর্তে প্রকারটি ব্যবহার করা উচিত।
আমি যখন জেএসএক্স থেকে টিএসএক্সে রূপান্তর করছি এবং আমরা কিছু লাইব্রেরি জেএস / জেএসএক্স হিসাবে রাখি এবং অন্যকে টিএস / টিএসএক্সে রূপান্তর করি তখন আমি প্রায় সবসময়ই টিএসএক্স \ টিএস ফাইলগুলিতে জেএস / জেএসএক্স আমদানির বিবৃতিগুলি পরিবর্তন করতে ভুলে যাই from
import * as ComponentName from "ComponentName";
প্রতি
import ComponentName from "ComponentName";
যদি টিএসএক্স থেকে কোনও পুরানো জেএসএক্স (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';
ত্রুটিটি সমাধান করার জন্য আপনার কাছে দুটি বিকল্প রয়েছে:
1. জেএসএক্সে উপাদানটি .default
ব্যবহার করার সময় যুক্ত করুন:
import ComponentName from './ComponentName'
const Component = () => <ComponentName.default />
আমদানি করার সময় "ডিফল্ট" হিসাবে রফতানি করা উপাদানটি পুনরায় নামকরণ করুন:
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
আপনি উভয় ক্ষেত্রেই অনুমতি দিন using প্রতিক্রিয়া ঘোষণার ফাইল অনুযায়ী টাইপটি সংজ্ঞায়িত করা হয় ...
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
এটি টিএস ত্রুটিটি ঠিক করবে।
তুমি ব্যবহার করতে পার
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) { ... }