reactjs - Generiğin, bir React bileşeninin props’u olabilecek bir tür olmasını nasıl kısıtlayabilirim?


Şu anda, başka bir bileşeni prop olarak alan ve sonra o bileşenin tüm prop'larını ona geçirmek için prop olarak gerektiren bir bileşen oluşturmak için TypeScript derleyicisiyle uğraşmayı yeni bitirdim. (Kullanım durumu, Gatsby <PrivateRoute> bileşenleri içindir).

Aslında bunu çalıştırmayı başardım, ama sorun şu ki neden çalıştığını çözemedim.

İşte basitleştirilmiş bir örnek:

Sarmalayıcı bileşen ve tanımlı özellikler:

type WrapperProps<T> = { component: React.ComponentType<T> } & T;

const Wrapper = <T extends object>({
    component: Component,
    ...rest
}: WrapperProps<T>) => {
    return <Component {...(rest as T)} />;
};

ve amaçlanan kullanım:

interface person {
    name: string;
    age: number;
}

const ShowPerson = ({ name, age }: person) => {
    return (
        <h1>
            {name}, {age}
        </h1>
    );
};

const Display = () => {
    return <Wrapper component={ShowPerson} name="T" age={12} />;
};

Çalıştığını neden çözemediğim kısım, sarmalayıcı bileşendeki genel sınırlamada. <T extends object>'i kaldırırsam, şu hatayı alacağım: "type 'Omit<WrapperProps<T>, "component">' türünün 'T' türüne dönüştürülmesi bir hata olabilir çünkü hiçbir tür diğerinin üzerine yeterince örtüşmüyor

Şimdi, generic'in kısıtlanması gerektiği mantıklı, ama <T extends object> kullanmaktan daha iyi bir kısıtlama var mı? Neden <T extends {}> çalışmıyor? Bir React bileşeninin props'u olarak çalışacak kabul edilebilir ve daha iyi bir generic kısıtlaması ne olurdu? extends object bana doğru çözüm gibi gelmiyor.

Düzenle Bu, ...rest as unknown as T olarak dönüştürerek de işlevsel hale getirilebilir, ama yine de bunu anlamaya çalışıyorum:

const Wrapper = <T,>({
    component: Component,
    ...rest
}: WrapperProps<T>) => {
    return <Component {...(rest as unknown as T)} />;
};

Typescript Oynatma Alanı örneği