面试题答案
一键面试实现使用TypeScript交叉类型融合基础组件属性
假设我们有两个基础组件 Button
和 Input
,它们分别有自己的属性类型:
// Button组件属性类型
type ButtonProps = {
label: string;
onClick: () => void;
};
// Input组件属性类型
type InputProps = {
value: string;
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
};
// 复合组件属性类型,融合Button和Input属性
type CompositeComponentProps = ButtonProps & InputProps;
// 复合组件
const CompositeComponent: React.FC<CompositeComponentProps> = ({
label,
onClick,
value,
onChange
}) => {
return (
<div>
<button onClick={onClick}>{label}</button>
<input value={value} onChange={onChange} />
</div>
);
};
可能遇到的类型冲突问题及解决方案
- 同名属性类型冲突
- 问题描述:当两个基础组件有同名属性,但类型不同时,会产生冲突。例如,
Button
和Input
都有一个名为id
的属性,Button
的id
类型为number
,Input
的id
类型为string
。 - 解决方案:
- 重新设计属性名称:避免在不同组件中使用相同名称的属性,这样可以从根本上解决冲突。例如,将
Button
的id
改为buttonId
,Input
的id
改为inputId
。 - 统一属性类型:如果属性语义相同,可以统一属性类型。比如都改为
string
类型,这样在交叉类型中就不会冲突。如果id
在两个组件中的语义不同,也可以通过重新设计属性名称来区分。
- 重新设计属性名称:避免在不同组件中使用相同名称的属性,这样可以从根本上解决冲突。例如,将
- 问题描述:当两个基础组件有同名属性,但类型不同时,会产生冲突。例如,
- 函数参数类型冲突
- 问题描述:当两个基础组件的同名函数属性,其参数类型不同时会产生冲突。例如,
Button
的onClick
函数没有参数,而Input
的onClick
函数接受一个MouseEvent
参数。 - 解决方案:
- 使用联合类型:可以将函数参数类型定义为联合类型。例如,
type OnClickType = (() => void) | ((e: MouseEvent<HTMLButtonElement>) => void)
,然后在交叉类型中使用这个联合类型作为onClick
的类型。但这种方式可能会使函数调用时的逻辑变得复杂,需要在实现函数时处理不同的参数情况。 - 重命名函数:将其中一个组件的函数属性重命名,比如将
Input
的onClick
改为onInputClick
,这样在交叉类型中就不会有冲突。
- 使用联合类型:可以将函数参数类型定义为联合类型。例如,
- 问题描述:当两个基础组件的同名函数属性,其参数类型不同时会产生冲突。例如,