react/typescript中的通用道具-如何使T成为属性的类型?

react/typescript中的通用道具-如何使T成为属性的类型?,typescript,Typescript,我试过无数次,但都没能成功 我有react组件的道具,handleChange的类型应该是一个函数,它接受作为值传递的任何内容 type Props<T extends Record<string, unknown> = Record<string, unknown>> = { value: T, handleChange: (value: T) => void } 类型道具={ 值:T, handleChange:(值:T)=>void

我试过无数次,但都没能成功

我有react组件的道具,
handleChange
的类型应该是一个函数,它接受作为
值传递的任何内容

type Props<T extends Record<string, unknown> = Record<string, unknown>> = {
   value: T,
   handleChange: (value: T) => void
}
类型道具={
值:T,
handleChange:(值:T)=>void
}
我试图让T成为“值的类型”,但在本例中,它们只是默认为
记录
,这不是我想要的


这在material ui(即自动完成)中执行过度。

TypeScript有一个强大的推理系统,它允许您不手动指定通用参数,而是根据运行时参数的类型进行分配。对于React+TypeScript,如下所示:

type MyComponentProps<T extends Record<string, unknown>> = {
  value: T;
  handleChange: (value: T) => void;
};

const MyComponent = <T extends Record<string, unknown>>(
  props: MyComponentProps<T>
) => {
  return null;
};

class MyOtherComponent<
  T extends Record<string, unknown>
> extends React.Component<MyComponentProps<T>> {
  render() {
    return null;
  }
}
// This works
<MyComponent
  value={{ a: "hi", this: { is: "a", test: true } }}
  handleChange={(val) => {
    console.log("val.a =", val.a, "val.this =", val.this);
  }}
/>
<MyOtherComponent
  value={{ a: "hi", this: { is: "a", test: true } }}
  handleChange={(val) => {
    val.a = val.this.is;
  }}
/>
// This fails
<MyComponent
  value="not a Record<string, unknown>"
  handleChange={() => {}}
/>
类型MyComponentProps={
值:T;
handleChange:(值:T)=>void;
};
常量MyComponent=(
道具:MyComponent道具
) => {
返回null;
};
类MyOtherComponent<
T延续记录
>扩展React.Component{
render(){
返回null;
}
}
//这很有效
{
console.log(“val.a=”,val.a,“val.this=”,val.this);
}}
/>
{
val.a=val.this.is;
}}
/>
//这失败了
{}}
/>

您设置了默认值,它使用了默认值。我不知道你期望什么。如果您添加默认值是因为您不想指定泛型类型,即希望从
值的类型推断出它,那么在扩展
记录的实际函数或类中有一个泛型,并将其转发到
Props
的泛型参数,从而删除所有默认值。感谢您的帮助。我没想到我的例子会奏效,我只是想展示我所做的努力。你说得对,我想推断它,但我看到的所有示例都试图区分特定的已知类型,如
TypeA | TypeB
,但我试图推断传入的任何内容,只要它是记录。我不明白扩展
Record
的“实际类”必须是什么。我如何创建这样一个类来转发泛型,或者如何发现它?它是有效的!令人惊叹的。只是一件小事,有没有办法用这个符号来表示<代码>常量MyComponent:React.FC=()=>…
?不,这是不可能的。不能使用匿名函数中声明的泛型来键入包含它的变量。
MyComponent
的类型与所需的
React.FC
类型兼容,因此理论上您不必担心它。在最坏的情况下,您始终可以强制执行。