2017-06-06 5 views
2

Wie definiert man generischen Typ in reagieren zustandslose Komponenten basierend auf Parameter oder außerhalb Konfiguration?Typescript Reagieren zustandslose Funktion mit generischen Parameter/Rückgabetypen

Beispiel Komponenten:

interface IProps<V> { 
    value: V; 
    doSomething: (val: V) => void; 
} 

const Comp: React.SFC<IProps<number>> = <T extends number>({ 
    value: T, 
    doSomething 
    }) => { 
return <div />; 
} 

obiges Beispiel wird funktionieren, aber nur mit Zahlen als Werte.

ist möglich, aktualisiere so etwas wie zu erreichen:

const Comp: React.SFC<IProps<??>> = <?? extends string | number>({ 
    value, /* of type ?? */ 
    doSomething 
    }) => { 
return <div />; 
} 

Damit wir, was wir wollen Zahlen entscheiden können, oder Strings, wenn Komponente.

Wunsch Nutzung:

// This should setup generic type to string 
<Comp value="string" ... /> 

// Or number 
<Comp value={123} ... /> 

// Should be compilation error as we cannot use * on 'text' * 5 
<Comp value="text" doSomething={val => val * 5} /> 

Edit: Sollte gleiche Arbeit wie function tut:

function Comp <T>({value, doSomething}: IProps<T>) { ... } 

SFC-Typ hat Definition:

interface SFC<P> { 
    (props: P & { children?: ReactNode }, context?: any): ReactElement<any>; 
    ... 
} 

Antwort

3

konnte ich dies tun in TS 2.3. Der Punkt ist, 2 Arten für "innerhalb" und "außerhalb" dieser Komponente zu verwenden.

interface IProps<V> { 
    value: V; 
    doSomething(val: V): void; 
} 

// type "inside" component 
function _Comp<T>(props: IProps<T>) { 
    return <div />; 
} 

// type for "outside" of component 
interface GenericsSFC extends React.SFC<any> { 
    <T>(props: IProps<T> & { children?: React.ReactNode }, context?: any): JSX.Element; 
} 

const Comp = _Comp as GenericsSFC; 

// dont type check: v is of type "hey" 
<Comp value={"hey"} doSomething={v => v - 1} />; 
+0

scheint zu funktionieren, da nur neugierig ist, wenn .. Auch nicht etwas einfacher Weg ist, 'GenericsSFC' iRequisiten benötigt, die innerhalb Komponente eingegeben werden, so ist es wahrscheinlich am besten auch im Inneren GenericSFC zu halten ... Wahrscheinlich am besten kann sein, nur typisierte Funktion zu behalten und SFC überhaupt nicht für Generika zu verwenden: o – Jurosh

Verwandte Themen