javascript - React.PropsWithChildren, `children` dışında başka prop olmayan?


Benim children dışında prop'u olmayan bir bileşenim var, yani:

function Foo({ children }: React.PropsWithChildren<>) {}

React.PropsWithChildren bir argüman gerektirir. Eğer React.PropsWithChildren<{}> yaparsam, Eslint ‘{}’ tür olarak kullanılmasın. ‘{}’ aslında “null olmayan herhangi bir değer” anlamına gelir. uyarısını verir.

Bunu boş nesne türü için kullanıyorum:

type EmptyObj = { [k: string]: never };

Ancak, React.PropsWithChildren<EmptyObj> şuna neden olur:

Type '{ children: Element; }' is not assignable to type 'EmptyObj'.
  Property 'children' is incompatible with index signature.
    Type 'Element' is not assignable to type 'never'.

React.PropsWithChildren'ye ne geçirmeliyim?

Düzenle:

Sadece şunu yapabileceğimi biliyorum:

function Foo({ children }: { children?: React.ReactNode }) {}

Ancak, kod tabanında React.PropsWithChildren kullanıyorum, bu yüzden tutarlı kalmayı tercih ederim.

Cevap #1

Ben de aynı durumdaydım ve şunu seçmeye karar verdim:

PropsWithChildren<unknown>

Güncelleme:

Aşağıdaki Jorrit'in yorumuna bakın, ancak React artık PropsWithChildren için bunu varsayılan yapıyor, ki bu şimdi type PropsWithChildren<P=unknown> ... olarak tanımlanmış durumda. Bu, aşağıdaki örneği basitleştirebileceğimiz anlamına geliyor:

const MyComponent = ({ children }: PropsWithChildren) => { /* ... */ }

Çocukları kabul eden bir bileşen ilan ediyoruz, ancak sahip olabileceği diğer özellikler hakkında bilmiyoruz (veya umursamıyoruz).

Örnek:

const MyComponent = ({ children }: PropsWithChildren<unknown>) => { /* ... */ }

// ...

<MyComponent>
  <span>children</span>
</MyComponent>

FC tipi neden değil?

FC türünün kullanımı önerilmemektedir. Bununla ilgili daha fazla bilgiyi bu PR'de okuyabilirsiniz: https://github.com/facebook/create-react-app/pull/8177

Cevap #2

Çözüm şudur:

function Foo({ children }: React.PropsWithChildren<Record<never, any>>) {}

Eğer eslint size any türü hakkında uyarı veriyorsa, onun yerine Record<never, never> kullanın.

İlgili makaleler