microsoft / microsoft/TypeScript
Props requiring casting on complex type (and defaultProps not settable)
Abierto
@weswigham ya está trabajando en esto.
Desde el 8/12/2018.
Bug
Domain: JSX/TSX
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.4k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
Search Terms:
defaultProps React.RefForwardingComponent ExoticComponent
Code
// import { cx } from "emotion";
import * as React from "react";
// import modifiers, { ModifierProps } from "../../modifiers";
interface RenderAsExoticComponent<
TOwnProps,
TDefaultComponent extends
| keyof JSX.IntrinsicElements
| React.ComponentType<any>
>
extends Pick<
React.ForwardRefExoticComponent<any>,
keyof React.ForwardRefExoticComponent<any>
> {
(
props: React.ComponentPropsWithRef<TDefaultComponent> &
TOwnProps & { renderAs?: never },
): JSX.Element | null;
<TAsComponent extends keyof JSX.IntrinsicElements | React.ComponentType<any>>(
props: React.ComponentPropsWithRef<TAsComponent> &
TOwnProps & { renderAs: TAsComponent },
): JSX.Element | null;
}
function renderAsComponent<
TOwnProps,
TDefaultElement extends React.ComponentType<any> | keyof JSX.IntrinsicElements
>(
factory: React.RefForwardingComponent<
any,
TOwnProps & {
renderAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements;
className?: string;
}
>,
defaultElement: TDefaultElement,
) {
const forward = React.forwardRef(factory);
forward.defaultProps = { renderAs: defaultElement };
// todo: apparently a bug, use workaround
// forward.defaultProps = {};
// forward.defaultProps.renderAs = defaultElement;
return forward as RenderAsExoticComponent<TOwnProps, TDefaultElement>;
}
interface ModifierProps {
textColor?: "white" | "black";
pull?: "left" | "right";
}
const Element = renderAsComponent<ModifierProps, "div">(
({ className, renderAs, ...allProps }, ref) => {
const props = {
// className: cx(className, modifiers.classNames(allProps)) || undefined,
ref,
// ...modifiers.clean(allProps),
};
return React.createElement(renderAs!, props);
},
"div",
);
export default Element;
export const Example: React.SFC<{}> = () => (
<Element textColor="white" pull={"left" as "left"}>
Child
</Element>
);
Expected behavior:
defaultPropscan be set directlypropswork without casting
Actual behavior:
defaultPropscannot be set directly (see workaround in code)propsdo not work without being cast.
Playground Link:
Related Issues:
No.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Evaluación
Este issue todavía no se ha evaluado.