인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

재미있는 말미잘님의 프로필 이미지
재미있는 말미잘

작성한 질문수

Slack 클론 코딩[실시간 채팅 with React]

DMList 소켓 연결 중에 타입스크립트 에러

작성

·

170

0

const DMList: FC = () => {
const { workspace } = useParams<{ workspace?: string }>();
const {
data: userData,
error,
revalidate,
mutate,
} = useSWR<IUser>("/api/users", fetcher, {
dedupingInterval: 2000, // 2초
});
const { data: memberData } = useSWR<IUserWithOnline[]>(
userData ? `/api/workspaces/${workspace}/members` : null,
fetcher
);
const [socket] = useSocket(workspace);
const [channelCollapse, setChannelCollapse] = useState(false);
const [countList, setCountList] = useState<{ [key: string]: number }>({});
const [onlineList, setOnlineList] = useState<number[]>([]);

 

useSocket(workspace)에서 

TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.

  Type 'undefined' is not assignable to type 'string'.

 

에러가 뜨는데 workspace?: string으로 명시해주었는데 왜 이런 에러가 발생하는건가요? 깃허브에서 똑같이 코드를 가져왔는데도 같은 에러가 발생해서 어떤 점이 문제인지 도무지 알 수가 없어 여쭈어봅니다..ㅠㅠㅠ

 

 

 

 

 

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

useSocket.ts 코드 보여주세요.

import io from "socket.io-client";
import React, { useCallback } from "react";

//ts에서 빈배열이나 빈객체에는 타이핑을 해줘야 한다!!!!!!
const sockets: { [key: string]: SocketIOClient.Socket } = {};
const backUrl = `http://localhost:3095`;

const useSocket = (
workspace: string
): [SocketIOClient.Socket | undefined, () => void] => {
const disconnect = useCallback(() => {
sockets[workspace].disconnect;
delete sockets[workspace];
}, [workspace]);

if (!workspace) return [undefined, disconnect];
sockets[workspace] = io.connect(`${backUrl}/ws-${workspace}`, {
transports: ["websocket"], //http연결을 요청(polling) 하지않고 바로 웹소켓만 하용하도록 명시
});

// const socket = io.connect(`${backUrl}`);
//보내기
// sockets[workspace].emit("hello", "world");
// //받기
// sockets[workspace].on("message", (data: any) => {
// console.log(data);
// });
// sockets[workspace].on("data", (data: any) => {
// console.log(data);
// });
// sockets[workspace].on("onlineList", (data: any) => {
// console.log(data);
// });

return [sockets[workspace], disconnect];
};

export default useSocket;
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

여기서도 (workspace?: string) 이어야합니다. 워크스페이스가 undefined일 수도 있어서요

헉 ㅠㅠㅠㅠㅠ해결했습니다 감사합니다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

재미있는 말미잘님의 프로필 이미지
재미있는 말미잘

작성한 질문수

질문하기