在arrow函数中将JavaScript对象分解转换为Typescript
我已经将下面的箭头函数destructure转换为Typescript,但是我不知道如何解释最后一项:icon:icon。此项目未导入或声明 原始JavaScript:在arrow函数中将JavaScript对象分解转换为Typescript,javascript,typescript,arrow-functions,destructuring,Javascript,Typescript,Arrow Functions,Destructuring,我已经将下面的箭头函数destructure转换为Typescript,但是我不知道如何解释最后一项:icon:icon。此项目未导入或声明 原始JavaScript: const NavbarDropdown = ({ children, count, showBadge, header, footer, icon: Icon }) => ( <UncontrolledDropdown nav inNavbar className="mr-2&
const NavbarDropdown = ({
children,
count,
showBadge,
header,
footer,
icon: Icon
}) => (
<UncontrolledDropdown nav inNavbar className="mr-2">
<DropdownToggle nav className="nav-icon dropdown-toggle">
<div className="position-relative">
<Icon className="align-middle" size={18} />
const NavbarDropdown=({
儿童
计数
展示徽章,
标题,
页脚,
图标:图标
}) => (
已转换为TypeScript,但{icon:icon}错误除外,其中除了在函数体中之外的任何位置都未导入或声明图标:
const NavbarDropdown = (
{children} : {children: string},
{count} : {count: number},
{showBadge} : {showBadge: boolean},
{header} : { header: string},
{footer} : { footer: string},
{icon: Icon},
) => (
<UncontrolledDropdown nav inNavbar className="mr-2">
<DropdownToggle nav className="nav-icon dropdown-toggle">
<div className="position-relative">
<Icon className="align-middle" size={18} />
const NavbarDropdown=(
{children}:{children:string},
{count}:{count:number},
{showBadge}:{showBadge:boolean},
{header}:{header:string},
{footer}:{footer:string},
{icon:icon},
) => (
更新:我了解此组所指的图标/图标,但我仍然找不到任何导入或声明图标的地方。如建议的,这里是NavbarDropdown调用的代码片段:
<Collapse navbar>
<Nav className="ml-auto" navbar>
<NavbarDropdown
header="New Messages"
footer="Show all messages"
icon={MessageCircle}
count={messages.length}
showBadge
>
{messages.map((item, key) => {
return (
<NavbarDropdownItem
key={key}
icon={
<img
className="avatar img-fluid rounded-circle"
src={item.avatar}
alt={item.name}
/>
}
title={item.name}
description={item.description}
time={item.time}
spacing
/>
);
})}
</NavbarDropdown>
{messages.map((项,键)=>{
返回(
);
})}
两个似乎很突出的问题:
图标问题
{icon:icon}
错误除外,其中icon
未在函数体之外的任何位置导入或声明
在JavaScript版本中,图标
/图标
如下所示:
const NavbarDropdown=({
儿童
计数
展示徽章,
标题,
页脚,
图标:图标
}) => (
该图标:icon
看起来很像TypeScript类型,但它不是。它是解构的一部分。它获取对象上icon
属性的值,并将其分配给图标
标识符。就好像您有这样一个:
const-NavbarDropdown=(道具)=>{
让孩子们=道具。孩子们;
// ...
让Icon=props.Icon;
因此,函数中用于它的标识符以大写字符开头,因此它可以用作JSX中的React组件:
(如果您使用的是
,则它将是HTML元素,而不是React组件。)
Re#2:您的代码id将分解一系列参数,每个属性一个。相反,您将类型放在分解后{}
s:
const NavbarDropdown = ({
children,
count,
showBadge,
header,
footer,
icon: Icon
}: {
children: string;
count: number;
showBadge: boolean;
header: string;
footer: string;
icon: React.Component;
}) => (
<UncontrolledDropdown nav inNavbar className="mr-2">
<DropdownToggle nav className="nav-icon dropdown-toggle">
<div className="position-relative">
<Icon className="align-middle" size={18} />
...
请注意,由于您是通过使用带有React.FC
的通用参数来告诉TypeScript道具的类型,因此不必再在参数列表中提供该类型
但通常情况下,功能组件中的
子项应为ReactNode
类型,而不是string
string
将起作用,因为ReactNode
是一种联合类型,而string
是其一部分,但它将缩小子项的类型,通常您希望允许所有类型children.您的TypeScript版本与JavaScript版本具有完全不同的签名。请尝试使用const-navbdropdown:React.FC=…
{children,count,…}:{children:string,count:number,…
您所做的是创建一个多参数函数,而不是一个具有1个参数的函数,您可以销毁它。React.FC
唯一的问题是OP已经决定children
是一个字符串,而不是ReactNode。图标
不是React.Component
@Keith-关于儿童
,谢谢。尽管他们可能要求它只是一个字符串,但因为ReactNode
是一个联合体,联合体中的一个东西是字符串
,他们可以缩小它的范围。:-@Keith-这是一个提出的非常好的观点。:-)@T.J.Crowder等人。-感谢您澄清了如何分解一系列参数。我在其他线程中看到了一些示例,但显然被误解了。
interface NavbarDropdownProps {
children: string;
count: number;
showBadge: boolean;
header: string;
footer: string;
icon: React.Component;
}
const NavbarDropdown = ({
children,
count,
showBadge,
header,
footer,
icon: Icon
}: NavbarDropdownProps) => (
<UncontrolledDropdown nav inNavbar className="mr-2">
<DropdownToggle nav className="nav-icon dropdown-toggle">
<div className="position-relative">
<Icon className="align-middle" size={18} />
...
interface NavbarDropdownProps {
children: string;
count: number;
showBadge: boolean;
header: string;
footer: string;
icon: React.Component;
}
const NavbarDropdown: React.FC<NavbarDropdownProps> = ({
children,
count,
showBadge,
header,
footer,
icon: Icon
}) => (
<UncontrolledDropdown nav inNavbar className="mr-2">
<DropdownToggle nav className="nav-icon dropdown-toggle">
<div className="position-relative">
<Icon className="align-middle" size={18} />
...