gpt4 book ai didi

reactjs - 如何使用 Typescript 向样式化组件添加属性?

转载 作者:搜寻专家 更新时间:2023-10-30 21:46:01 27 4
gpt4 key购买 nike

我有这样的组件

import React from 'react';

import styled from '../../styled-components';

const StyledInput = styled.input`
display: block;
padding: 5px 10px;
width: 50%;
border: none;
border-radius: 10px;
outline: none;
background: ${(props) => props.theme.color.background};
font-family: 'Roboto', sans-serif;
`
;

export const Input = () => {
return <StyledInput placeholder="All notes"></StyledInput>
}

我想像这样将它们作为属性放在“索引”组件上

import styled from 'styled-components';

import { Input } from './Input';

const NoteTags:any = styled.div`
display: flex;
justify-content: space-between;
align-items: center;
width: 20%;
height: 5%;
border-bottom: 2px solid ${(props) => props.theme.color.background}; `;

NoteTags.Input = Input;

export default NoteTags;

然后我可以像这样使用它们

import React from 'react';

import NoteTags from '../../blocks/note-tags';

const ComponentNoteTags = () => {
return (
<React.Fragment>
<NoteTags.Input></NoteTags.Input>
</React.Fragment>
)
}

export default ComponentNoteTags;

这个问题是属性 InputNoteTags 上不存在,所以 typescript 给我一个错误。我可以通过将类型 any 设置为 NoteTags 来解决它,但我不确定这是最好的方法。

有没有更好的方法来修复它?

最佳答案

更新

我发现使用类型助手将额外的属性添加到组件的变量中要好得多:

// type-helper.ts
export function withProperties<A, B>(component: A, properties: B): A & B {
Object.keys(properties).forEach(key => {
component[key] = properties[key]
});
return component as A & B;
}

Note: @Allan points out in the comment, type assertion might be necessary like so:

(component as any)[key] = (properties as any)[key]

to avoid typescript complaining about Element implicitly has an 'any' type because type '{}' has no index signature.

我们只是传递 properties 中的每个属性至 component并给它一个两者的联合类型。然后我们可以将子组件“粘合”到主组件中,如下所示:

// component/index.ts
import MainComponent from './MainComponent';
import SubComponent1 from './SubComponent1';
import SubComponent2 from './SubComponent2';
import { withProperties } from '../type-helper.ts';

export withProperties(MainComponent, { SubComponent1, SubComponent2 })

照常使用

import MainComponent from './Component';

export default () => (
<MainComponent>
<SubComponent1 />
<SubComponent2 />
</MainComponent>
)

这种方法也适用于普通的 React 组件,而不仅仅是样式化组件,所以我认为它更好。

这是一个 codesandbox demo with both approaches I've shared ,其中一个使用您的代码。


上一个回答

假设您使用的是最新的软件包:

"styled-components": "^4.1.3",
"@types/styled-components": "^4.1.10",

您可以创建一个 interection type包括父组件和子组件的类型:

import styled, { StyledComponent } from 'styled-components'
import ChildComponent from '...'

type Component = StyledComponent<'div', any> & {
ChildComponent: /* your component type */
}

interface IProps {
...
}

// create styled component per usual
const MyComponent = styled.div<IProps>`
...
` as Component

MyComponent.ChildComponent = ChildComponent;

这是 StyledComponent definition :

export type StyledComponent<
C extends keyof JSX.IntrinsicElements | React.ComponentType<any>,
T extends object, // theme interface
O extends object = {}, // props interface
A extends keyof any = never
> = string & StyledComponentBase<C, T, O, A>;

您可以将其用作 StyledComponent<C, T, O, A>StyledComponent<C, T>

关于reactjs - 如何使用 Typescript 向样式化组件添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54812930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com