TypeScript의 React 프로젝트 활용 사례 요약
6754 단어 TypeScriptReact활용단어참조
서문
본고는 TS의 기본 개념이 아니라 프로젝트에서 TypeScript(이하 TS)가 React와 결합된 사용 상황에 중심을 두겠습니다.TS 유형 보기는 온라인 TS 도구를 사용할 수 있습니다.👉TypeScript 놀이터
React 요소 관련
React 요소와 관련된 유형은 주로
ReactNode
, ReactElement
, JSX.Element
입니다.ReactNode
.임의의 유형을 나타내는 React 노드입니다. 이것은 연합 유형으로 상황이 매우 많습니다.ReactElement/JSX
.사용 표현을 보면 이 두 가지가 일치한다고 볼 수 있으며 ReactNode
에 속하는 서브집합으로 "원생 DOM 구성 요소"또는 "사용자 정의 구성 요소의 실행 결과"를 나타낸다.
const MyComp: React.FC<{ title: string; }> = ({title}) => <h2>{title}</h2>;
// ReactNode
const a: React.ReactNode =
null ||
undefined || <div>hello</div> || <MyComp title="world" /> ||
"abc" ||
123 ||
true;
// ReactElement JSX.Element
const b: React.ReactElement = <div>hello world</div> || <MyComp title="good" />;
const c: JSX.Element = <MyComp title="good" /> || <div>hello world</div>;
원본 DOM 관련
기본 DOM 관련 유형은 다음과 같습니다.
Element
, HTMLElement
, HTMLxxxElment
.간단히 말하면
Element = HTMLElement + SVGElement
.SVGElement
일반적으로 개발은 비교적 적게 사용되지만 HTMLElement
는 매우 흔하다. 그의 하위 유형은 HTMLDivElement
, HTMLInputElement
, HTMLSpanElement
등을 포함한다.따라서 우리는 그 관계가
Element > HTMLElement > HTMLxxxElement
, 원칙적으로 가능한 한 상세하게 쓰는 것을 알 수 있다.React 작성 이벤트 관련
React에서 원본 이벤트는 React 이벤트로 처리되고 그 내부는 이벤트 의뢰를 통해 메모리를 최적화하고 DOM 이벤트 연결을 줄인다.본론으로 돌아가면React 이벤트의 일반적인 형식은 [xxx] Event이고 흔히 볼 수 있는 것은
MouseEvent
, ChangeEvent
, TouchEvent
범용 형식이며 범용 변수는 이 이벤트를 촉발하는 DOM 요소 형식이다.예는 다음과 같습니다.
// input
const handleInputChange = (evt: React.ChangeEvent<HTMLInputElement>) => {
console.log(evt);
};
// button
const handleButtonClick = (evt: React.MouseEvent<HTMLButtonElement>) => {
console.log(evt);
};
// div
const handleDivTouch = (evt: React.TouchEvent<HTMLDivElement>) => {
console.log(evt);
};
훅스와의 결합
hooks에서 모든 갈고리가 TS와 강한 관련이 있는 것은 아니다. 예를 들어useEffect는 TS에 의존하지 않고 유형 정의를 한다. 우리는 비교적 흔히 볼 수 있는 몇 개의 TS와 강한 관련이 있는 갈고리를 골라서 보자.
useState
만약 초기 값이 유형을 설명할 수 있다면useState에 범용 변수를 가리키지 않아도 된다.
// ❌ , 0 count
const [count, setCount] = useState<number>(0);
// ✅
const [count, setCount] = useState(0);
초기 값이null 또는undefined라면, 원하는 형식을 수동으로 전송하고, 속성에 접근할 때 선택할 수 있는 체인을 통해 문법 오류를 피해야 합니다.
interface IUser {
name: string;
age: number;
}
const [user, setUser] = React.useState<IUser | null>(null);
console.log(user?.name);
useRef
이 훅은 비교적 특별하다. 보통 두 가지 용도가 있다.
DOM 요소를 가져오기 위해 DOM을 연결합니다.
// DOM, null, undefined, HTMLxxxElement
// inputRef.current , , null !
const inputRef = useRef<HTMLInputElement>(null!);
const handleClick = () => {
inputRef.current.focus(); // , inputEl.current?.focus()
}
return (
<input ref={inputRef} />
<button onClick={handleClick}> </button>
)
2. 변수를 저장하는 데 사용됩니다. 함수식 구성 요소의 외부에 저장되기 때문에usestate에 비해 비동기적인 업데이트 문제가 존재하지 않을 뿐만 아니라 capture-value
특성으로 인해 유행이 지난 변수도 존재하지 않습니다. 그러나 값을 부여한 후ref 인용이 변하지 않아 다시 렌더링을 일으키지 않도록 주의해야 합니다.
//
const sum = useRef(0);
// .current
sum.current = 3;
//
console.log(sum.current); // 3
useSelector
useselector는 store의 상태를 가져오는 데 사용됩니다. 첫 번째 고정 매개 변수는 함수입니다. 함수의 삽입은store이고 store의 유형인 RootState는store에서 미리 정의해야 합니다. 흔히 볼 수 있는 정의는 다음과 같습니다.
스토어에서.ts:
const store = createStore(rootReducer);
export type RootState = ReturnType<typeof rootReducer>;
사용:
const { var1, var2 } = useSelector((store: RootState) => store.xxx);
사용자 정의 훅
만약useState의 형식을 본떠서 하나의 그룹을 되돌려야 한다면, 되돌려 주는 값의 끝에 asconst를 사용해야 합니다. 이 되돌려 주는 값은 상수입니다. 그렇지 않으면 되돌려 주는 값은 연합 형식으로 추정됩니다.
const useInfo = () => {
const [age, setAge] = useState(0);
return [age, setAge] as const; // ,[number, React.Dispatch<React.SetStateAction<number>>]
};
redux 관련
action의 정의에 대해 우리는 공식적으로 노출된 AnyAction을 사용하여 action 내부 키 값에 대한 제한을 다음과 같이 완화할 수 있다.
import { AnyAction } from "redux";
const DEF_STATE = {
count: 0,
type: 'integer'
};
// redux AnyAction
function countReducer(state = DEF_STATE, action: AnyAction) {
switch (action.type) {
case "INCREASE_COUNT":
return {
...state,
count: state.count + 1,
};
case "DECREASE_COUNT":
return {
...state,
count: state.count - 1,
};
default:
return state;
}
}
export default countReducer;
규약
서브어셈블리의 엔트리 이름은 다음과 같은 [어셈블리 이름] Props입니다.
// InfoCard
export interface InfoCardProps {
name: string;
age: number;
}
인터페이스 인터페이스 형식은 대문자로 시작합니다.백엔드 인터페이스의 출입을 위해 인터페이스를 작성하고 편집기가 제시하는 jsdoc 스타일에 대한 설명을 합니다. 예를 들어 다음과 같습니다.
export interface GetUserInfoReqParams {
/** */
name: string;
/** */
age: number;
/** */
gender: string;
}
기타
키 이름이나 키 값이 확실하지 않으면 어떻게 처리합니까?
// , number
export interface NotSureAboutKey {
[key: string]: number;
}
// ,
export interface AllNotSure {
[key: string]: any;
}
어떻게 인터페이스에서 범용 변수를 사용합니까?
범주형이란 미리 정의된 유형이다.그 목적은 유형 정의의 국부적 유연성을 달성하고 복용성을 높이는 것이다.우리는 일반적으로 인터페이스에서 범용 (예:
// ,
interface IHuman<T = unknown> {
name: string;
age: number;
gender: T;
}
//
const youngMan: IHuman<string> = {
name: 'zhangsan',
age: 18,
gender: 'male'
}
TypeScript가 React 프로젝트에서의 사용에 대한 요약 기사는 여기 있습니다. 더 많은 TypeScript가 React에서 사용한 내용에 대해서는 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Cypress에서 Stripe Elements의 자동 테스트 수행을 사용하여 E2E 테스트를 작성할 때 약간의 고려가 필요했기 때문에 비망으로 남겨 둡니다 ✍️ 을 사용하여 이런 코드에서 카드 번호 입력 요소를 만들었습니다. 본래라면, 카드 정보의 입력이 다른 도메인(Stripe...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.