reactjs - 返回一个对象数组和函数打字稿
问题描述
首先,我面临的问题:
我用香草 JS 自制的 React Hook 工作了几个月,代码如下:
import { useState } from 'react';
const useForm = (initialValues) => {
const [state, setState] = useState(initialValues);
return [
state,
(e) => {
if (typeof e.target !== 'undefined') {
setState({
...state,
[e.target.name]: e.target.value,
});
} else {
setState({ ...e });
}
},
];
};
export default useForm;
现在,我决定使用 Typescript。但是无法转换该钩子。除了返回接口/类型之外,我一切都准备好了。相同的钩子 Typescript 版本(返回类型错误):
import { useState, FormEvent } from 'react';
interface ReturnProps {
[index: number]: Record<string, unknown>;
[index: number]: (e: FormEvent<HTMLInputElement>) => void;
}
const useForm = (initialValues: Record<string, unknown>): ReturnProps => {
const [state, setState] = useState(initialValues);
return [
state,
(e: FormEvent<HTMLInputElement>): void => {
if (typeof e.currentTarget !== 'undefined') {
setState({
...state,
[e.currentTarget.name]: e.currentTarget.value,
});
} else {
setState({ ...e });
}
},
];
};
export default useForm;
问题是:在这种情况下如何返回正确的类型?
解决方案
您只需要修复ReturnProps
类型:
interface ReturnProps {
[index: number]: Record<string, unknown>;
[index: number]: (e: FormEvent<HTMLInputElement>) => void;
}
你不能有两个这样的重复索引签名。
由于返回数组中的第一个元素将是记录,第二个元素将是回调,因此请改用元组:
type ReturnProps = [
Record<string, unknown>,
(e: FormEvent<HTMLInputElement>) => void
]
你甚至可以ReturnProps
完全省略,TS 仍然能够推断出正确的类型:
const useForm = (initialValues: Record<string, unknown>) => {
(让 TS 在可能的情况下自动推断类型可以真正减少可能分散脚本主要逻辑的类型噪音。)
推荐阅读
- visual-studio - 无法为 IIS 配置的 Web 应用程序项目找到 Web 服务器
- c++ - 为什么在某些编译器中可以声明一个像 int myarr[noconstant]; 这样的数组?而不是在其他人?
- javascript - 标记模板以摆脱第一个换行符
- python - 在 django 的模板中显示用户从模型中的 protrait
- java - 如何使用 jackson ObjectMapper 解析 Mongodb 的 UUID 对象?
- python - 如何从python中的json文件中提取名称列表?
- javascript - 2D 对象数组 - 传递参考副本时替换数组对象
- list - 转换地图
> 列出 - python - 正则表达式在给定单词之前和之后获取单词
- visual-studio-code - Visual Studio Code - 终端历史记录保存在哪里?