Typescript Generics Quick Intro with react basics
24403 단어 reactgenericstypescriptjavascript
This article needs some basic understanding of typescript to advance further.
타이프스크립트의 배열
우리가 항상 사용하는 가장 기본적인 제네릭 유형은 특정 유형의 배열을 정의하는 것입니다. 예: number[],string[],boolean[];
type numArr = Array<number>;
type strArr = Array<string>;
type boolArr = Array<boolean>;
let numberArray: numArr = [1, 2, 3, 4];
let stringArray: strArr = ["H", "e", "l", "l", "o"];
let boolArray: boolArr = [true, false, true];
console.log(numberArray);
console.log(stringArray);
console.log(boolArray);
특정 유형을 전달하지 않으면 아래 그림과 같이 화면에 오류가 표시됩니다.
제네릭 메서드
전달된 모든 배열 유형의 middleElement를 반환할 수 있는 메서드가 필요하다고 가정합니다. 따라서 middleElement를 찾는 가장 기본적인 접근 방식은 다음과 같습니다.
const middleElement = (arr: Array<any>) => {
return arr[Math.floor(arr.length / 2)];
};
let numberArray: numArr = [1, 2, 3, 4, 5];
let stringArray: strArr = ["I", "T", "A", "L", "Y"];
let boolArray: boolArr = [true, false, true];
let middle1 = middleElement(numberArray);
let middle2 = middleElement(stringArray);
let middle3 = middleElement(boolArray);
console.log(middle1); //3
console.log(middle2); //A
console.log(middle3); //false
그러나 이 방법으로 마우스를 가져가면 'any'를 표시하는 아래 그림에서 볼 수 있듯이 메서드 반환 유형의 TypeDefinition을 잃게 됩니다.
이제 typescript의 제네릭 기능을 구현하면 메서드의 typeDefinition을 유지할 수 있습니다.
const middleElement = <T>(arr: Array<T>) => {
return arr[Math.floor(arr.length / 2)];
};
위의 그림에서 특정 유형의 middleElement 메서드 위로 마우스를 가져가면 해당 인수가 전달된 유형 및 반환 유형을 볼 수 있습니다.
//We can explicitly define type of our method as below :
let middle2 = middleElement<string>(stringArray);
하나 이상의 일반 유형을 허용할 수 있는 메서드를 만들기 위해 다음을 수행할 수 있습니다.
//This method will accept any type of arguments and make a combined object of it.
const makeObj = <X, Y>(x: X, y: Y) => {
return { x, y };
};
let numbArray: numArr = [1, 2, 3, 4];
let Obj = { firstName: "Vinod", lastName: "Chauhan" };
let newObj = makeObj(numbArray, Obj);
console.log(newObj);
위의 그림에서 makeObj 메서드의 반환 유형을 볼 수 있습니다. 이는 VS 코드 편집기에서 제네릭의 힘을 보여줍니다.
필수 필드가 있는 일반 메서드
개체를 매개 변수로 사용하는 'makeICardDetail' 메서드가 필요하다고 가정해 보겠습니다. 이 개체는 요구 사항을 충족하기 위해 이름, 성, 나이를 필수 필드로 요구했습니다. 따라서 이를 수행하는 한 가지 방법은 다음과 같습니다.
const makeICardDetail = (obj: {
firstName: string;
lastName: string;
age: number;
}) => {
return {
...obj, //Copy other contents of Object as it is.
ICard: obj.firstName + " " + obj.lastName + ", " + obj.age
};
};
let makeNewDetail = makeICardDetail({
firstName: "Vinod",
lastName: "Chauhan",
age: 27
});
console.log(makeNewDetail.ICard); //Vinod Chauhan, 27
이제 필수 필드가 아닌 위치도 전달해야 하는 경우에는 어떻게 해야 합니까? makeICardDetail의 위치 필드를 인수로 전달하면 TypeScript 컴파일러에서 오류가 발생합니다.
let makeNewDetail = makeICardDetail({
firstName: "Vinod",
lastName: "Chauhan",
age: 27,
location: "India"
});
console.log(makeNewDetail.ICard); //Vinod Chauhan, 27
//TSC compiler
index.ts:59:3 - error TS2345: Argument of type '{ firstName: string; lastName: string; age: number; location: string; }' is not assignable to parameter
of type '{ firstName: string; lastName: string; age: number; }'.
Object literal may only specify known properties, and 'location' does not
exist in type '{ firstName: string; lastName: string; age: number; }'.
59 location: "India"
~~~~~~~~~~~~~~~~~
[9:01:00 PM] Found 1 error. Watching for file changes.
여기서 제네릭은 '확장' 기능으로 우리를 구해줍니다.
const makeICardDetail = <T extends { firstName: string; lastName: string; age: number }>( obj: T) => {
return {
...obj,
ICard: obj.firstName + " " + obj.lastName + ", " + obj.age
};
};
그리고 아래 그림을 보면 'makeNewDetail' 변수가 복잡하고 긴 애플리케이션에 도움이 되는 모든 가능한 값의 옵션을 제공하는 것을 볼 수 있습니다.
제네릭과의 인터페이스
interface KeyPair<T, U> {
key: T;
value: U;
}
let kv1: KeyPair<number, string> = { key: 1, value: "Vinod" }; // OK
let kv2: KeyPair<number, number> = { key: 2, value: 12345 }; // OK
React의 제네릭
TypeScript로 React 작업을 해본 적이 있다면 'props'가 전달되어야 하는 기능적 구성 요소를 구현해야 합니다. 소품은 구성 요소에 typedefinition을 제공합니다.
import React from "react";
interface Props {
name: string;
}
export const Example: React.FC<Props> = ({ name }) => {
return <div>Hello {name}</div>;
};
위 스니펫에서 "React.FC"props는 필드와 함께 선언된 유형이 있는 인터페이스 유형인 일반으로 전달됩니다.
또한 useState를 사용하여 제네릭을 정의할 수 있습니다.
export const Example: React.FC<Props> = ({name}) => {
//const [state] = React.useState({fullName:"",age:0});
const [state] = React.useState<{fullName:string | null;age : number}>({fullName : "",age:0});
return <div>Hello {name}</div>;
};
이 기사가 TypeScript를 사용한 반응 학습에 약간의 지식을 추가하기를 바랍니다.
Reference
이 문제에 관하여(Typescript Generics Quick Intro with react basics), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vinodchauhan7/typescript-generics-quick-intro-with-react-basics-42j8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)