Javascript Typescript未读取正确的类型
我有这个钩子:Javascript Typescript未读取正确的类型,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,我有这个钩子: 从“react”导入{ChangeEvent,reobject,useffect,useState}; 类型OriginalOnchange=(e:ChangeEvent)=>void; 类型OnchangeEvent=ChangeEvent; 导出类型OnChangeWrapper=(originalOnchange?:originalOnchange)=>(onchangeEvent:onchangeEvent)=>void; 导出常量useTrackValidity=( i
从“react”导入{ChangeEvent,reobject,useffect,useState};
类型OriginalOnchange=(e:ChangeEvent)=>void;
类型OnchangeEvent=ChangeEvent;
导出类型OnChangeWrapper=(originalOnchange?:originalOnchange)=>(onchangeEvent:onchangeEvent)=>void;
导出常量useTrackValidity=(
inputRef:重新对象,
值:字符串,
invalidInputMessage?:字符串
) => {
const[isValid,setIsValid]=useState();
const onChangeWrapper:onChangeWrapper=(originalOnchange?:originalOnchange)=>(onChangeEvent:onChangeEvent)=>{
setIsValid(!(!!invalidInputMessage | |!onChangeEvent.currentTarget.validity.valid));
如果(!!原始更改){
原始更改(onChangeEvent);
}
};
useffect(()=>{
if(输入参考电流){
inputRef.current.setCustomValidity(invalidInputMessage | |“”);
setIsValid(!(!!invalidInputMessage | |!inputRef.current.validity.valid));
}
},[inputRef,invalidInputMessage,value]);
返回[isValid,onChangeWrapper];
};
当我这样称呼它时:
const[isValid,onChangeWrapper]=useTrackValidity(inputRef,value?.toString()??“”,invalidInputMessage);
返回(
);
我得到这个错误:
TS2349: This expression is not callable.
Not all constituents of type 'boolean | OnChangeWrapper' are callable.
Type 'false' has no call signatures. TS2722: Cannot invoke an object which is possibly 'undefined'.
每当我调用onChangeWrapper
时
当我将上述内容更改为:
const[isValid,onChangeWrapper]=useTrackValidity(inputRef,value?.toString()??“”,invalidInputMessage)作为[
布尔值|未定义,
一次性包装
];
它确实有效,这让我感到奇怪,因为我基本上重复了返回类型。TypeScript推断返回的数组将是
array
——也就是说,所有元素都将是这些类型的交集boolean
是不可调用的,因此如果没有某种保护,就不能调用任何元素
要解决此问题,请告诉TypeScript您的钩子函数返回[布尔,yourFunctionType]
,具体如下:
type onChangeWrapperType = /*...the function type here...*/;
// ...
export const useTrackValidity = (
// ...
): [boolean, onChangeWrapperType] => {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^−−−−−−−−−−−−−−−−−−−−−−−−−− here
// ...
const onChangeWrapper: onChangeWrapperType = /*...*/;
// ...
return [isVaild, onChangeWrapper];
};