【发布时间】:2022-01-03 19:30:50
【问题描述】:
我创建了这个名为 StateWithValidation 的 React 组件。
import { useStateWithValidation } from "./useStateWithValidation";
export const StateWithValidation = () => {
const [username, setUserName, isValid] = useStateWithValidation(
(value: string) => value.length > 5,
""
);
return (
<div>
<div>Valid: {isValid.toString()}</div>
<input
type="text"
value={username}
onChange={(e) => setUserName(e.target.value)}
/>
</div>
);
};
我有一个通用的自定义钩子,它验证和处理用户输入更改。
import { useCallback, useState } from "react";
type useStateValidationFn = <U>(
validationFunc: (value: U) => boolean,
initialState: U
) => [U, (nextState: U) => void, boolean];
export const useStateWithValidation: useStateValidationFn = (
validationFunc,
initialValue
) => {
const [state, setState] = useState(initialValue);
const [isValid, setIsValid] = useState(() => validationFunc(state));
const onChange = useCallback(
(nextState) => {
setState(nextState);
setIsValid(validationFunc(nextState));
},
[validationFunc]
);
return [state, onChange, isValid];
};
为什么我在React组件中输入的时候,泛型类型的值是""而不是字符串。
【问题讨论】:
-
因为你的初始状态是 ""... add
使用你的钩子时, -
为什么不是从我传递的方法推断出来的 (value: string) => value.length > 5 ?
-
这是一个有趣的问题;我很惊讶这里有一个字面的上下文。可能与ms/TS#43804 相关,也可能不相关。研究尚未发现任何确定的结果。
-
是的,我无法找到答案;一般而言,如果您有
T extends string,那么您可以期望推断出像""这样的字符串文字类型,但是没有约束的T通常会推断出像string这样的扩展类型。 minimal reproducible example 可能是 this code。有人(你?)可能想打开GitHub issue 询问发生了什么事。我会继续寻找一点,但我并不乐观。
标签: reactjs typescript