Ini adalah kebingungan antara konstruktor dan instance .
Ingat bahwa ketika Anda menulis komponen di Bereaksi:
class Greeter extends React.Component<any, any> {
render() {
return <div>Hello, {this.props.whoToGreet}</div>;
}
}
Anda menggunakannya dengan cara ini:
return <Greeter whoToGreet='world' />;
Anda tidak menggunakannya dengan cara ini:
let Greet = new Greeter();
return <Greet whoToGreet='world' />;
Dalam contoh pertama, kita sedang melewati Greeter
, fungsi konstruktor untuk komponen kita. Itu penggunaan yang benar. Pada contoh kedua, kami membagikan turunan dari Greeter
. Itu salah, dan akan gagal saat runtime dengan kesalahan seperti "Objek bukan fungsi".
Masalah dengan kode ini
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
adalah bahwa ia mengharapkan turunan dari React.Component
. Apa yang Anda inginkan fungsi yang mengambil konstruktor untuk React.Component
:
function renderGreeting(Elem: new() => React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
atau serupa:
function renderGreeting(Elem: typeof React.Component) {
return <span>Hello, <Elem />!</span>;
}
@types/react
paling mudah digunakanfunction RenderGreeting(Elem: React.ComponentType) { ... }
function renderGreeting(Elem: typeof React.Component)
dalam ES6?function renderGreeting (Elem: new() => React.SFC<any>){...}
Jika demikian mengapa kita menyatakan jenis SFC seperti ini:,const Hello:React.SFC<any> = (props) => <div>Hello World</div>
dan tidak: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; };
Saya mendapatkan kesalahan "Properti 'tipe' tidak ada pada tipe 'typeof Komponen'".Jika Anda ingin mengambil kelas komponen sebagai parameter (vs contoh), gunakan
React.ComponentClass
:sumber
React.ComponentType<any>
jenisnya sebagai gantinya.Ketika saya mengkonversi dari JSX ke TSX dan kami menyimpan beberapa perpustakaan sebagai js / jsx dan mengonversi yang lain ke ts / tsx, saya hampir selalu lupa untuk mengubah pernyataan impor js / jsx di file TSX \ TS dari
import * as ComponentName from "ComponentName";
untuk
import ComponentName from "ComponentName";
Jika memanggil komponen gaya JSX (React.createClass) tua dari TSX, maka gunakan
var ComponentName = require("ComponentName")
sumber
tsconfig.json
) menjadiallowSyntheticDefaultImports
. Lihat: typescriptlang.org/docs/handbook/compiler-options.html dan diskusi di sini: blog.jonasbandi.net/2016/10/...Jika Anda benar-benar tidak peduli dengan alat peraga maka jenis yang seluas mungkin adalah
React.ReactType
.Ini akan memungkinkan lewat elemen dom asli sebagai string.
React.ReactType
mencakup semua ini:sumber
Jika Anda menggunakan material-ui , pergi ke ketik definisi komponen, yang digarisbawahi oleh TypeScript. Kemungkinan besar Anda akan melihat sesuatu seperti ini
Anda memiliki 2 opsi untuk menyelesaikan kesalahan:
1.Tambahkan
.default
ketika menggunakan komponen di JSX:2. Ganti nama komponen, yang diekspor sebagai "default", ketika mengimpor:
Dengan cara ini Anda tidak perlu menentukan
.default
setiap kali Anda menggunakan komponen.sumber
Berikut ini berfungsi untuk saya: https://github.com/microsoft/TypeScript/issues/28631#issuecomment-472606019 Saya memperbaikinya dengan melakukan sesuatu seperti ini:
sumber
Dalam kasus saya, saya menggunakan
React.ReactNode
sebagai tipe untuk komponen fungsional, bukanReact.FC
tipe.Dalam komponen ini tepatnya:
sumber
Sebagai @Jthorpe disinggung,
ComponentClass
hanya memungkinkan baikComponent
atauPureComponent
tapi bukanFunctionComponent
.Jika Anda mencoba untuk melewatkan
FunctionComponent
, naskah akan melontarkan kesalahan yang mirip dengan ...Namun, dengan menggunakan
ComponentType
daripada yangComponentClass
Anda izinkan untuk kedua kasus. Per file deklarasi reaksi jenisnya didefinisikan sebagai ...sumber
Dalam kasus saya, saya tidak ada
new
di dalam definisi tipe.some-js-component.d.ts
mengajukan:dan di dalam
tsx
file tempat saya mencoba mengimpor komponen yang tidak diketik:sumber
Ketika mendeklarasikan komponen React Class, gunakan
React.ComponentClass
alih-alihReact.Component
itu akan memperbaiki kesalahan ts.sumber
Kamu bisa memakai
Namun, apakah cara berikut ini berhasil?
sumber