typescript - Högre ordningens klass med generics i Javascript?
Jag undrar om det finns ett korrekt sätt att kapsla in en klass på ett sätt som liknar en högre ordningens komponent i React Native? Jag har följande:
const RecyclerViewDataWrap = <P>(Wrapee: Class<React$Component<P, *>>) => {
return class {
props: P
constructor(props: P){
this.props = props
}
render(){
return (
<Wrapee {... this.props} />
)
}
}
}
export default RecyclerViewDataWrap
// in some other component file:
export const SomeComponentData = RecyclerViewDataWrap(SomeComponent)
Detta gör att jag kan skapa SomeComponentData-objekt som kommer att rendera SomeComponents med de props jag säger åt det. Jag skulle dock vilja kunna deklarera den generiska typen tillsammans med det så att konstruktorn kan veta vilka typer den vill ha. Helst skulle jag vilja göra något som detta:
type Props = {
title?: string,
price?: number,
}
export const SomeComponentData = RecyclerViewDataWrap<Props>(SomeComponent)
Svar #1
Jag har fått det på ett sätt (jag använde klass Props istället för typ):
Säg att du har
class SomeComponent {
constructor(public name: string) {
}
}
och
class Props {
title?: string;
price?: number;
}
då skulle du kunna göra:
type Constructor<T> = new(...args: any[]) => T;
function RecyclerViewDataWrap<P, T extends Constructor<{}>>(Props: new ()=> P, Base: T) {
return class extends Base {
props: P = new Props();
constructor(...args: any[]) {
super(...args);
}
}
}
const SomeComponentData = RecyclerViewDataWrap(Props, SomeComponent);
let componentData = new SomeComponentData("My Component");
componentData.props.title = 'My title';
console.log(componentData);
Jag har gjort detta mest baserat på https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#support-for-mix-in-classes och Typescript instansiera generiskt objekt
Kanske kan @cartant bekräfta detta eftersom han verkar veta mycket mer om det här.
