【发布时间】:2021-03-08 04:20:01
【问题描述】:
如何为其中一个 props 的值取决于另一个 props 的值的 React 组件编写 Typescript 类型?
我正在尝试编写一个Icon 组件,该组件在 SVG 路径中查找预定义地图中的图标。地图是嵌套的,因此顶级属性是图标样式。这些样式中的每一个都有自己的地图,其中属性是图标名称。像这样:
const icons = {
regular: {
check: '',
},
solid: {
on: '',
},
};
组件接受一个 prop $flair 是图标样式和 $name 这是图标名称。我需要将这两个道具关联起来,以便$name 的值仅限于此$flair 的图标。如果$flair 是'regular',那么$name 可以是'check',但不能是'on'。
到目前为止,这是我要做的:
type Icons = typeof icons;
type FlairNames = keyof Icons;
type IconNames = keyof Icons['regular'] | keyof Icons['solid'];
type Test = Extract<IconNames, keyof Icons['regular']>;
interface IconProps<F extends FlairNames> {
$size?: number;
$flair: F;
$name: Extract<IconNames, keyof Icons[F]>;
}
function IconImpl({
$size,
$flair,
$name,
}: IconProps<'regular'> | IconProps<'solid'>): JSX.Element {
const flair = icons[$flair];
const d = flair[$name];
return (
<svg>
<path d={d} />
</svg>
);
}
我希望能够按如下方式使用该组件:
<Icon $flair="regular" $name="check" />
<Icon $flair="solid" $name="on" />
<Icon $flair="regular" $name="does-not-exist" /> // error
<Icon $flair="regular" /> // error
<Icon $name="on" /> // error
【问题讨论】:
-
我可以帮助你输入这个,但是道具名称中的 $ 的目的是什么?
标签: reactjs typescript