TypeScript로 useState React Hook에 유형 설정


90

후크 기능 (React v16.7.0-alpha)을 사용하기 위해 React with TypeScript 프로젝트를 마이그레이션하고 있지만 구조화 요소의 입력을 설정하는 방법을 알 수 없습니다.

다음은 그 예입니다.

interface IUser {
  name: string;
}
...
const [user, setUser] = useState({name: 'Jon'});

user변수 유형 을 강제하고 싶습니다 IUser. 내 유일한 성공적인 평가판은 두 단계로 수행하는 것입니다. 입력 한 다음 초기화 :

let user: IUser;
let setUser: any;
[user, setUser] = useState({name: 'Jon'});

하지만 더 나은 방법이 있다고 확신합니다. 또한를 입력으로 받고 아무것도 반환하지 않는 setUser함수로 초기화되어야합니다 IUser.

또한 const [user, setUser] = useState({name: 'Jon'});초기화없이 사용 하면 잘 작동하지만 특히 일부 소품에 의존하는 경우 TypeScript를 사용하여 init에서 유형 검사를 강제하고 싶습니다.

당신의 도움을 주셔서 감사합니다.

답변:


176

이것을 사용하십시오

const [user, setUser] = useState<IUser>({name: 'Jon'});

여기에서 해당 유형을 참조하십시오. https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8a1b68be3a64e5d2aa1070f68cc935d668a976ad/types/react/index.d.ts#L844


그것이 바로 제가 찾던 것입니다. 감사합니다 @Nurbol
htaidirt

5
나는 지난 6 개월 동안 6 회에 대해이 답변에 언급 한
알폰소 페레즈

1
@orome 아니요, 거기에 아무것도 넣을 수 없습니다.와 호환되는 객체 만 넣을 수 IUser있습니다. 즉, 동일한 속성이 있습니다. 덕 타이핑이라고합니다.
Nurbol Alpysbayev

1
@ JoãoMarcosGris type MyType = MyObj[]; 그때useState<MyType>
Nurbol Alpysbayev

1
@JoeyBaruch 아니요, 우리는 아닙니다 :-) 그냥 시도해보십시오. 그런 다음 유형 정의를 살펴보면 useState할당 된 [user, setUser]올바른 유형의 튜플 을 반환하는 것을 볼 수 있으며 TypeScript가 변수가 튜플 구성 요소와 동일한 유형이어야한다는 것을 이해하는 것이 어렵지 않습니다. 내가 일을 정리했는지 더 이상 혼란스러워하는지 모르겠습니다.
Nurbol Alpysbayev

18

먼저 useStateIUser가 될 제네릭을 가져옵니다. 그런 다음 반환 된 두 번째 비 구조화 된 요소를 전달하려면 useStateDispatch를 가져와야합니다. 클릭 핸들러가있는 다음 확장 버전의 예제를 고려하십시오.

import React, { useState, Dispatch } from 'react';

interface IUser {
  name: string;
}

export const yourComponent = (setUser: Dispatch<IUser>) => {

    const [user, setUser] = useState<IUser>({name: 'Jon'});

    const clickHander = (stateSetter: Dispatch<IUser>) => {
        stateSetter({name : 'Jane'});
    }

    return (
         <div>
            <button onClick={() => { clickHander(setUser) }}>Change Name</button>
        </div>
    ) 
}

답변을 참조하십시오 .



1

https://fettblog.eu/typescript-react/hooks/

// import useState next to FunctionComponent
    import React, { FunctionComponent, useState } from 'react';
    
    // our components props accept a number for the initial value
    const Counter:FunctionComponent<{ initial?: number }> = ({ initial = 0 }) => {
      // since we pass a number here, clicks is going to be a number.
      // setClicks is a function that accepts either a number or a function returning
      // a number
      const [clicks, setClicks] = useState(initial);
      return <>
        <p>Clicks: {clicks}</p>
        <button onClick={() => setClicks(clicks+1)}>+</button>
        <button onClick={() => setClicks(clicks-1)}>-</button>
      </>
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.