I am trying to add the following function, taken from bootstrap-react
documentation, to my TypeScript + React project:
function FieldGroup({ id, label, help, ...props }) {
return (
<FormGroup controlId={id}>
<ControlLabel>{label}</ControlLabel>
<FormControl {...props} />
{help && <HelpBlock>{help}</HelpBlock>}
</FormGroup>
);
}
However the rest/spread properties for ECMAScript 6 used as arguments are not supported by TypeScript versions < 2.1.
My current implementation is:
interface FieldGroupProps extends React.HTMLAttributes {
id?: string;
label?: string;
help?: string;
}
class FieldGroup extends React.Component<FieldGroupProps, {}> {
public render(): JSX.Element {
const rest = objectWithout(this.props, ["id", "label", "help"]);
return (
<FormGroup controlId={this.props.id}>
<ControlLabel>{this.props.label}</ControlLabel>
<FormControl {...rest} />
{this.props.help && <HelpBlock>{this.props.help}</HelpBlock>}
</FormGroup>
);
}
}
Is this functionally (not from a performance perspective) equivalent to the ECMAScript 6 version? If I missed something or it could be made more elegant, what is the recommended way to translate the use of the above rest/spread syntax?
const {a, b, c} = props; const htmlProps = rest(props, {a, b, c}); And once TypeScript supports object rest/spread I can just look for all usages of rest() and simplify it to const {a, b, c, ... htmlProps} = props . Save this answer.
Stateful and Stateless Components Stateless components, by contrast, have no state. Note that both types of components can use props.
To pass a function as props in React TypeScript: Define a type for the function property in the component's interface. Define the function in the parent component. Pass the function as a prop to the child component.
You should probably not. The consensus in the React community now seems to be that, you should avoid using React. FC because it causes the component to implicitly take children . This means the component will accept children, even if they're not supposed to.
In TypeScript 3, your first example will work fine so you don't need to rewrite it into a class.
If you like, you can also use your FieldGroupProps
interface as well as rewriting it into an arrow function.
const FieldGroup = ({ id, label, help, ...props }: FieldGroupProps) => <FormGroup controlId={id}>
<ControlLabel>{label}</ControlLabel>
<FormControl {...props} />
{help && <HelpBlock>{help}</HelpBlock>}
</FormGroup>;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With