Bir kod yazdım:
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
Bir hata alıyorum:
JSX öğe türünde
Elem
herhangi bir yapı veya çağrı imzası yok
Bunun anlamı ne?
Bir kod yazdım:
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
Bir hata alıyorum:
JSX öğe türünde
Elem
herhangi bir yapı veya çağrı imzası yok
Bunun anlamı ne?
Yanıtlar:
Bu, yapıcılar ve örnekler arasındaki bir karışıklıktır .
React'te bir bileşen yazarken şunu unutmayın:
class Greeter extends React.Component<any, any> {
render() {
return <div>Hello, {this.props.whoToGreet}</div>;
}
}
Bunu şu şekilde kullanırsınız:
return <Greeter whoToGreet='world' />;
Sen yok bu şekilde kullanın:
let Greet = new Greeter();
return <Greet whoToGreet='world' />;
İlk örnekte, etrafında geçiyoruz Greeter
, yapıcı işlevini bizim bileşeni için. Doğru kullanım budur. İkinci örnekte, bir çevrede geçiyoruz örneği arasında Greeter
. Bu yanlıştır ve çalışma zamanında "Nesne bir işlev değildir" gibi bir hatayla başarısız olur.
Bu kodla ilgili sorun
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
bir bekliyor olmasıdır örneği arasında React.Component
. İstediğin götüren bir fonksiyonudur bir kurucu için React.Component
:
function renderGreeting(Elem: new() => React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
veya benzer şekilde:
function renderGreeting(Elem: typeof React.Component) {
return <span>Hello, <Elem />!</span>;
}
function renderGreeting(Elem: typeof React.Component)
ES6'da nasıl yazacağız?
function renderGreeting (Elem: new() => React.SFC<any>){...}
öyleyse neden SFC türlerini şu şekilde açıklıyoruz: const Hello:React.SFC<any> = (props) => <div>Hello World</div>
ve değil: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; };
"Özellik 'türü', 'typeof Bileşeni' türünde mevcut değil" hatası alıyorum.
Bir bileşen sınıfını parametre olarak almak istiyorsanız (bir örneğe karşı), şunu kullanın React.ComponentClass
:
function renderGreeting(Elem: React.ComponentClass<any>) {
return <span>Hello, <Elem />!</span>;
}
React.ComponentType<any>
, onları kapsamak için muhtemelen türü kullanmalısınız.
JSX'ten TSX'e dönüştürdüğümde ve bazı kitaplıkları js / jsx olarak tutup diğerlerini ts / tsx'e dönüştürdüğümüzde, neredeyse her zaman TSX \ TS dosyalarındaki js / jsx içe aktarma deyimlerini değiştirmeyi unutuyorum.
import * as ComponentName from "ComponentName";
-e
import ComponentName from "ComponentName";
TSX'ten eski bir JSX (React.createClass) tarzı bileşeni çağırıyorsanız,
var ComponentName = require("ComponentName")
tsconfig.json
) olarak yapılandırırsanız, inport ifadesinin değiştirilmesi gerekmez allowSyntheticDefaultImports
. Bakın: typescriptlang.org/docs/handbook/compiler-options.html ve burada tartışma: blog.jonasbandi.net/2016/10/…
Sahne aksesuarlarını gerçekten önemsemiyorsanız, mümkün olan en geniş türdür React.ReactType
.
Bu, yerel dom öğelerinin dizge olarak aktarılmasına izin verir. React.ReactType
tüm bunları kapsar:
renderGreeting('button');
renderGreeting(() => 'Hello, World!');
renderGreeting(class Foo extends React.Component {
render() {
return 'Hello, World!'
}
});
Aşağıdakiler benim için çalıştı: https://github.com/microsoft/TypeScript/issues/28631#issuecomment-472606019 Bunu şöyle bir şey yaparak düzeltirim:
const Component = (isFoo ? FooComponent : BarComponent) as React.ElementType
Material -ui kullanıyorsanız , TypeScript tarafından altı çizilen bileşenin tür tanımına gidin. Büyük ihtimalle böyle bir şey göreceksiniz
export { default } from './ComponentName';
Hatayı çözmek için 2 seçeneğiniz var:
1. JSX'de .default
bileşeni kullanırken ekleyin:
import ComponentName from './ComponentName'
const Component = () => <ComponentName.default />
2. İçe aktarılırken "varsayılan" olarak dışa aktarılan bileşeni yeniden adlandırın:
import { default as ComponentName } from './ComponentName'
const Component = () => <ComponentName />
Bu şekilde .default
, bileşeni her kullandığınızda belirtmeniz gerekmez .
@Jthorpe değinildiği gibi, ComponentClass
sadece ya izin verir Component
veya PureComponent
ancak bir FunctionComponent
.
Eğer a geçmeye çalışırsanız FunctionComponent
, typcript ... benzeri bir hata verecektir.
Type '(props: myProps) => Element' provides no match for the signature 'new (props: myProps, context?: any): Component<myProps, any, any>'.
Ancak kullanarak ComponentType
ziyade ComponentClass
her iki durum için izin verir. React bildirim dosyası başına tür şu şekilde tanımlanır ...
type ComponentType<P = {}> = ComponentClass<P, any> | FunctionComponent<P>
Benim durumumda, React.ReactNode
tür yerine işlevsel bir bileşen için bir React.FC
tür kullanıyordum.
Bu bileşende tam olarak:
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>
}
/>
)
}
Benim durumumda new
tür tanımının içinde eksiktim.
some-js-component.d.ts
dosya:
import * as React from "react";
export default class SomeJSXComponent extends React.Component<any, any> {
new (props: any, context?: any)
}
ve tsx
türlenmemiş bileşeni içe aktarmaya çalıştığım dosyanın içinde :
import SomeJSXComponent from 'some-js-component'
const NewComp = ({ asdf }: NewProps) => <SomeJSXComponent withProps={asdf} />
Kullanabilirsiniz
function renderGreeting(props: {Elem: React.Component<any, any>}) {
return <span>Hello, {props.Elem}!</span>;
}
Ancak, aşağıdakiler çalışıyor mu?
function renderGreeting(Elem: React.ComponentType) {
const propsToPass = {one: 1, two: 2};
return <span>Hello, <Elem {...propsToPass} />!</span>;
}
Bileşeni dışa aktarmadan önce Type Assertions'ı kullanarak çözdüm . TypeScript, redux 'compose' kullanarak oluşturduktan sonra tanımlayamadı, bu nedenle sahne türlerini IParentProps ve IProps'a böldüm ve Type Assertions yaparken IParentProps'ı kullandım
import { compose } from 'react-redux'
import HOC1 from 'HOCs/HOC1'
import HOC2 from 'HOCs/HOC2'
type IParentProps = {}
type IProps = {}
const Component: React.FC<IProps & IParentProps> = React.memo((props) => {
return <SomeComponent {...props}/>
})
return compose(HOC1,HOC2)(Component) as React.FunctionComponent<IParentProps>
Fonksiyonel bileşeni herhangi bir bileşene destek olarak aktarıyorsanız, aşağıdakileri kullanın:
import React from 'react';
type RenderGreetingProps = {
element: React.FunctionComponent<any>
};
function RenderGreeting(props: RenderGreetingProps) {
const {element: Element} = props;
return <span>Hello, <Element />!</span>;
}
@types/react
bunları kullanıyorsanız , kullanımı en kolay yoldurfunction RenderGreeting(Elem: React.ComponentType) { ... }