'setMsgs' was used before it was defined
39 onMessage: ({ data }) => {
40 const msg = JSON.parse(data);
41 if (msg.type === "chat") {
42 setMsgs([...msgs, msg]); 43 return;
44 } else if (msg.type === "usersList") {
45 dispath(setOnlineUsers(msg.users));
'msgs' was used before it was defined
39 onMessage: ({ data }) => {
40 const msg = JSON.parse(data);
41 if (msg.type === "chat") {
42 setMsgs([...msgs, msg]); 43 return;
44 } else if (msg.type === "usersList") {
45 dispath(setOnlineUsers(msg.users));
'setSysMsg' was used before it was defined
45 dispath(setOnlineUsers(msg.users));
46 return;
47 }
48 setSysMsg(msg); 49 },
50 onOpen: () => {
51 const token = localStorage.getItem("token");
'setImages' was used before it was defined
14 const dispatch = useAppDispatch();
15 const [createProduct, { error, isLoading }] = useCreateProductMutation();
16 const closeHandler = () => {
17 setImages([]); 18 dispatch(setShowStep2(false));
19 };
20 const fileRef = useRef() as MutableRefObject<HTMLInputElement>;
'setSubmit' was used before it was defined
36 const productIcon = product.images ? product.images : [];
37 const productImages = [...productIcon, ...images];
38 dispatch(setProductData({ ...product, images: productImages }));
39 setSubmit(true); 40 const formData = new FormData();
41 formData.set("name", product.name);
42 formData.set("description", product.description);
'setSubmit' was used before it was defined
46 formData.append(`image${i + 1}`, productImages[i]);
47 }
48 await createProduct(formData);
49 setSubmit(false); 50 dispatch(setShowStep2(false));
51 setTimeout(
52 () =>
'fileRef' was used before it was defined
50 setSave(false);
51 };
52 const handleNewPfp = (e: ChangeEvent<HTMLInputElement>) => {
53 if (fileRef.current.files) { 54 let preview = URL.createObjectURL(fileRef.current.files[0]);
55 setPfp(fileRef.current.files[0]);
56 const newUserData = { ...userInfo, pfp: preview } as User;
'fileRef' was used before it was defined
51 };
52 const handleNewPfp = (e: ChangeEvent<HTMLInputElement>) => {
53 if (fileRef.current.files) {
54 let preview = URL.createObjectURL(fileRef.current.files[0]); 55 setPfp(fileRef.current.files[0]);
56 const newUserData = { ...userInfo, pfp: preview } as User;
57 setUserInfo(newUserData);
'setShowDelModal' was used before it was defined
67 });
68 const handleDelete = (name: string, id: number) => {
69 setDelProduct({ name, id });
70 setShowDelModal(true); 71 };
72 const fileRef = useRef() as MutableRefObject<HTMLInputElement>;
73 const [showDelModal, setShowDelModal] = useState(false);
'ConfirmDelete' was used before it was defined
198 </div>
199 </div>
200 <br />
201 <ConfirmDelete202 productName={DelProduct.name}
203 productID={DelProduct.id}
204 isShown={showDelModal}
'fileRef' was used before it was defined
52 const handleNewPfp = (e: ChangeEvent<HTMLInputElement>) => {
53 if (fileRef.current.files) {
54 let preview = URL.createObjectURL(fileRef.current.files[0]);
55 setPfp(fileRef.current.files[0]); 56 const newUserData = { ...userInfo, pfp: preview } as User;
57 setUserInfo(newUserData);
58
'setPosts' was used before it was defined
41 }, [lastId])
42 useEffect(() => {
43 if (data) {
44 setPosts([...posts, ...data.posts]) 45 }
46 }, [data])
47 useEffect(() => {
'setPosts' was used before it was defined
45 }
46 }, [data])
47 useEffect(() => {
48 setPosts([]) 49 getPosts({
50 productId: productId,
51 channel: (channel as string).toLowerCase(),
'posts' was used before it was defined
41 }, [lastId])
42 useEffect(() => {
43 if (data) {
44 setPosts([...posts, ...data.posts]) 45 }
46 }, [data])
47 useEffect(() => {
'EmptyLayout' was used before it was defined
8import { useGetUserInfoQuery } from '../src/state/reducers/api'
9import { HTML5Backend } from 'react-dnd-html5-backend'
10function MyApp({ Component, pageProps }: AppProps) {
11 const Layout = Component.Layout || EmptyLayout12 return (
13 <Provider store={store}>
14 <DndProvider backend={HTML5Backend}>
'DefaultLayout' was used before it was defined
12 return (
13 <Provider store={store}>
14 <DndProvider backend={HTML5Backend}>
15 <DefaultLayout>16 <Layout>
17 <Component {...pageProps} />
18 </Layout>
Description
Variables, functions and types should always be used after they've been defined. This issue will flag any code snippets that use variables or types before definition.
Sometimes, the code will run just fine even when the variable is declared after use. Consider the following example:
const ram: Resource = { type: "memory", limit: 1024 ** 3 }
type Resource = {
type: string;
limit: number;
}
Here, Resource
is used in the annotation before it has been defined.
Similarly, it is possible to hoist function declarations and variables declared with the var
keyword:
const four = twice(2);
function twice(n: number) {
return n * 2;
}
However, it makes the code harder to follow when variables or types are declared after being used.
Bad Practice
const knight: Radiant = {
order: "SurgeBinder"
strength: 30
}
interface Radiant {
order: string;
strength: number;
}
Recommended
interface Radiant {
order: string;
strength: number;
}
const knight: Radiant = {
order: "SurgeBinder"
strength: 30
}