开发者问题收集

使用 Typescript 响应 styled-component,类型错误

2021-07-29
1863

我有一个演示 这里

此应用程序正在设计一个反应 Link 组件。

我在Link Styled组件上有一个 isActive 道具。

控制台对此抱怨,因为它无法将 isActive 识别为 a DOM元素上的道具

文档说解决这个问题的方法是

从'react-router-dom'导入{Link as ReactRouterDonLink};

然后

const Link = ({isActive, children, ...props}) => {
  return(
    <ReactRouterDonLink {...props}>
      {children}
    </ReactRouterDonLink>
  )
}

const StyledLink = styled(Link)`
  color: blue;
  font-size: 40px;
  font-family: sans-serif;
  text-decoration: none;
  font-weight: ${p => p.isActive ? 'bold': 'normal'};
`;

ReactRouterDonLink 错误地说

类型'{ children: any; }' 但在类型 'LinkProps<any>' 中是必需的

因为 React Link 元素需要 to

如何向 ReactRouterDonLink 添加一个接口以包含 to

2个回答

这里的问题不是 styled-components。您需要明确将“to”属性传递给 ReactRouterDonLink 组件:

const Link = ({
  isActive,
  children,
  className,
  to
}: {
  isActive: boolean;
  children: ReactNode;
  className: string;
  to: string;
}) => {
  return <ReactRouterDonLink to={to} className={className}>{children}</ReactRouterDonLink>;
};

或者,您可以输入您的 props 对象:

const Link = (props: {
  isActive: boolean;
  children: ReactNode;
  to: string;
  className: string;
}) => {
  return <ReactRouterDonLink to={props.to} className={props.className}>{props.children}</ReactRouterDonLink>;
};
Brendan Bond
2021-07-29

我不明白您在 Link 周围制作的包装器的意义。

您可以直接为其设置样式:

import React, { Component } from 'react';
import { render } from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { Link } from 'react-router-dom';
import styled from 'styled-components';
import './style.css';

// see line below for how to correctly type styled-components in TS
// using the generic type parameters that the typings expect
const StyledLink = styled(Link)<{ $isActive?: boolean }>`
  color: blue;
  font-size: 40px;
  font-family: sans-serif;
  text-decoration: none;
  font-weight: ${p => (p.$isActive ? 'bold' : 'normal')};
`;

const App = () => {
  return (
    <BrowserRouter>
      <div>
        <StyledLink to="http://www.google.com" $isActive>
          Link
        </StyledLink>
      </div>
    </BrowserRouter>
  );
};

render(<App />, document.getElementById('root'));

为什么 $isActive 属性使用 $ 符号?这将其标记为瞬时属性,意味着它不会被复制到底层元素上。

https://styled-components.com/docs/api#transient-props

spender
2021-07-29