typescript - react/typescript 中的通用道具 - 如何让 T 成为属性的类型?
问题描述
我已经尝试了无数的东西,但无法让它工作
我有一个 react 组件的 props,并且类型handleChange
应该是一个函数,它接受任何作为values
.
type Props<T extends Record<string, unknown> = Record<string, unknown>> = {
value: T,
handleChange: (value: T) => void
}
我试图让 T 成为“类型value
”,但在这个例子中,它们只是默认为Record
这不是我想要的。
这是在材料 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={() => {}}
/>
推荐阅读
- node.js - findAll 与模型返回奇数值续集
- javascript - Javascript 和正则表达式调整 - 条带化字符串
- python - 如何将 json 文件导入 Blender?
- python - 用数组填充的 Pandas 列,连接数组内的值
- macos - 如何在 Mac OSX 上对 PyInstaller + PyQt 应用程序进行代码设计,避免在应用程序公证后出现“二进制未签名”错误?
- revit-api - 如果我在 BIM 360 更新我的 Revit 模型,我会丢失以前注册的问题吗?
- amazon-web-services - 仅允许从 S3 存储桶的特定文件夹中删除的 IAM 策略
- amazon-web-services - 为什么当我选择 USER_SRP_AUTH 作为身份验证流类型时,AWS Amplify 会尝试使用 CUSTOM_AUTH 进行身份验证?
- python - 如何在列长度检查中忽略 NaN
- php - 为什么刷新后按钮处于活动状态?