Typescript与Javascript的区别在于:ts是强类型,而js是弱类型。
在ts中每一个函数或者组件获得的参数都需要确定类型,这样我们就可以在静态页面中通过ts党的报错直接解决大部分bug,避免了js弱类型,只能在代码运行中报错的问题。
而在ts中,我们也应该避免使用any,any就意味着这个参数可以是任意类型,在运行代码时容易发生错误。
export const useDebounce = (value: any, delay: number)=> {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const timeout = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => clearTimeout(timeout);
}, [value, delay]);
return debouncedValue;
};
这是一段debounce代码,这里面传的参数value就定义为了any。
为了避免使用any,这里我们将any,改成unknown。
unknown相比较any更加的安全。
但是unknown类型不能调用属性和方法。
所以在使用debounce的文件中,我们获得以下报错:
由于debounce中return出来的debouncedValue是用来代替value参数进行处理请求的。
所以debouncedValue与value的类型必须相同。
既要安全又要相同,解法如下:
export const useDebounce = <V>(value: V, delay: number)=> {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const timeout = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => clearTimeout(timeout);
}, [value, delay]);
return debouncedValue;
};
使用泛型,通过V规范value的类型,使得debouncedValue类型与value相同,且不使用any。