# Compose typings
## `as` prop scenarios
Proposal: JSX in the as prop
Why:
* Component can encapsulate its typings
* Props can be provided which may override what the component passes along to the slot
* Can enable scenarios when props collide, such as when the component has its own `as` prop:
```jsx
<Thing as={ <Foo bar="2" /> } bar="1" />
```
```typescript=
type PropsWithAs<AsProps, Props> = AsProps extends string ?
{ as: NativeElement } & Omit<Props, ''> :
{ as: (props: AsProps)=> JSX.Element} & Props
```
## References
### styled-components usage with slots
https://styled-components.com/docs/api#as-polymorphic-prop
Why wouldn't `as` just take in primitive only? Because libraries like `styled-components` are built to provide styled primitive replacements:
```jsx
const Foo = styled.div`
background: red;
color: white;
`;
const App = () => (
<>
// Works today
<Button as={ Foo }>Hello</Button>
// Passing in `as` to the styled component doesn't work today, but could.
<Button as={{ type: Foo, props: { as: 'li' } }}>Hello</Button>
// ...and JSX makes shorthand of the above
<Button as={ <Foo as="li" /> }>Hello</Button>
</>
);
```