Typescript - 键入 React 组件时的 IntrinsicAttributes 和子类型问题

nob*_*are 4 javascript typescript reactjs

我正在迁移我的 React 文件.tsx并遇到了这个问题。

页脚.tsx

const Footer = ({ children, inModal }) => (
    <footer className={'(inModal ? " in-modal" : "") }>
        <div>
            {children}
        </div>
    </footer>
);

export default Footer;
Run Code Online (Sandbox Code Playgroud)

父组件.tsx

import Footer from 'path/to/Footer';

export class ParentComponent extends React.Component<{ showSomething: (() => void) }> {
    render() {
        return (
            <Footer>
                <Button onClick={() => this.props.showSomething()}>Add</Button>
            </Footer>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

<Footer>错误标记下方有一个红色下划线:

[ts] 输入 '{children: Element; }' 不可分配给类型 'IntrinsicAttributes & { children: any; inModal: 任何; }'。类型'{孩子:元素; }' 不可分配给类型 '{ children: any; inModal: 任何; }'。类型“{children: Element;”中缺少属性“inModal” }'。

我不太确定如何破译这意味着什么。任何帮助将不胜感激。

CRi*_*ice 8

该错误表明该Footer组件需要inModal传递给它一个 prop 。要解决此问题,您可以:

给它一个默认值:

const Footer = ({ children, inModal = false }) => ...
Run Code Online (Sandbox Code Playgroud)

告诉打字稿它是可选的:

const Footer = ({ children, inModal }: {children: any, inModal?: boolean}) => ...
Run Code Online (Sandbox Code Playgroud)

或者在使用页脚时明确提供该道具:

<Footer inModal={false}> ... </Footer>
Run Code Online (Sandbox Code Playgroud)

  • @JakeRobb在这种情况下,整个推论仅来自错误的最后部分:“类型'{children:Element;中缺少属性'inModal'” }`,这很直接地说明了这一点。由于该 prop 被标记为必需,因此类型系统显示错误;它不能被保留为未指定,因为它是最初编写的(有关详细信息,请参阅答案)。至于“内在属性”?它是表示所有 React 组件必须接受的 props 的类型(仅供参考:只有一个这样的 props,“key”,一个可选的“string | number”)。如果您真的陷入困境,也许可以考虑提出一个新问题? (5认同)
  • 很抱歉重新提出一个老问题,但是你能解释一下这个错误是如何表示的吗?什么是“内在属性”?类型系统出了什么问题导致缺少默认值而导致该错误?(我看到了同样的错误,但这些解决方案并没有为我解决它;我正在寻求更深入的理解。) (3认同)