在React和TypeScript中,要使子组件的Props
类型允许onChange
的data
参数类型根据name
参数类型进行推断,你需要使用泛型(Generics)。泛型允许你创建可重用的组件,这些组件可以工作于多种数据类型上。
下面是如何修改你的子组件Child
和父组件Parent
以利用泛型来实现这一点的示例:
// 子组件
type ChildProps<T> = {
name: T;
onChange: (data: T) => void;
};
export function Child<T>(props: ChildProps<T>) {
return (
<div
onClick={() => {
props.onChange(props.name);
}}
></div>
);
}
// 父组件
export function Parent() {
const name = '' as string; // 这里明确指定name的类型为string
return (
<Child
name={name}
onChange={(data: string) => { // 这里data的类型被推断为string
console.log(data);
}}
/>
);
}
// 或者,如果你想要TypeScript自动推断类型,你可以省略`onChange`中的类型注解:
export function ParentAutoInferred() {
const name = '' as string; // 这里明确指定name的类型为string
return (
<Child
name={name}
onChange={(data) => { // TypeScript将自动推断data的类型为string
console.log(data);
}}
/>
);
}
在这个例子中,Child
组件现在是一个泛型组件,它接受一个类型参数T
,该类型参数用于指定name
和onChange
的data
参数的类型。在Parent
组件中,我们明确指定了name
的类型为string
,因此onChange
的data
参数也被自动推断为string
类型。
如果你不想在Parent
组件的onChange
处理函数中明确指定类型,TypeScript也会基于Child
组件的泛型参数来自动推断data
的类型。这就是在ParentAutoInferred
组件中我们所做的。