[Week13] Nest Js CH2

안나경·2024년 4월 12일

크래프톤정글

목록 보기
51/57

리액트...
도 시간나면 볼까나

CH2 웹 개발 기초 지식

2.5 타입 스크립트

2.5.1 변수 선언

선언키워드 변수명 : 타입
let letB : string;

2.5.2 지원하는 타입

원시값, 객체, 함수.
typeof instance === "undefined"
등으로 타입을 알 수 있다.

  • symbol : 유일하고 변경 불가능한 원시값.
    객체 속성의 키로 사용.
  • bigint : Number의 범위(64비트 형식..)
    를 넘어서는 정수

number는 NaN, Infinity도 가능.

any/unknown/never

  • any : 어떠한 타입의 값도 받음
  • unknown : 어떠한 타입도 가능하나
    다른 변수에 할당, 또는 사용시에는 타입을 강제(?)
  • never : 어떤 값도 할당 불가.
    합수의 리턴 타입(void..) 어떠한 값도 반환하지 않음을 뜻함.
    또는 특정 타입의 다른 값을 할당받지 못하도록 설정
    (T가 무슨 타입이라면 ? never : T 등으로 true일때만 가능하다든가.)

2.5.3 타입 정의하기

interface User { name: string;}

변수에 객체를 바로 할당하지 않고
미리 타입을 정의.

class에서도 interface 선언 가능.
class User { constructor(name:string){}}

또 type 키워드로 새로운 타입 만들수 있음.
type MyUser = User;

기존 타입을 그대로 사용하나
도메인에 맞게 가공 가능.

2.5.4 타입 구성하기

Union 타입
function getLength(obj: string | string[]){ ...}

로 하면 getLength는 전자도 후자도 타입을 가질 수 있음.
변수가 가지는 값도 제한 가능.

type Status = "Ready" | "Waiting";

열거형도 가능.

enum Status {
	READY = "Ready",
    WAITING = "Waiting",
    }

제네릭 타입

어떠한 타입이든 정의 가능하나
호출되는 시점에서 타입 결정.

function identity<T>(arg: T): T {
}

앞에 <>를 붙이는게 방법인듯함.
보통 대문자 한글자를 사용한다고함.

2.6 데커레이터(decorator)

cross-cutting-concern을 분리하여
관점지향 프로그래밍 적용 가능.

클래스, 메서드, 접근자,
속성, 매개변수에 적용 가능.

각 요소 선언부 앞에 @로 시작하는 데커레이터를 선언하면
데커레이터로 구현된 코드를 함께 실행함.

class CreateUserDto {
 @IsEmail()
 @MaxLength(60)
 readony email: string;
 }

잉 그럼 class 같이 뭐
선언할때 쓰는 함수? 그런 건가.

원래 class 안에 함수는 못 쓰든가.
들어오기 전에 검사하는 함수 뭐 그런건가.
내가 짜야?하는 거겠지.

tsconfig.json 파일 안 experimentalDecorators 옵션을
true로 해야 할수 있다고 한다.

런타임에 호출되는 함수라고 하는데...

음, 직접 선언해서 쓰긴 하는군.
어떤 것의 데커레이터를 쓰느냐에 따라 인수가 정해져있나보네.

데커레이터 자체가 인수를 받게 하고 싶다면

function 함수(인수) {
	return function (본래 인수) {인수}}

같은 형식.
(후자는 함수명을 기재 안 함.)

2.6.1 데커레이터 합성

여러개의 데커레이터 사용 시
수학적으로 f(g(x))같은 결과.

식은 이렇게.

@f
@g
test
  • 위에서 아래로 평가(evaluate)됨.
  • 아래에서 위로 호출(call)됨.

대강
1(eval)-> 2(eval) -> 2(call)-> 1(call)
같은 DFS 같음.

2.6.2 클래스 데커레이터

클래스 정의를 읽거나 수정 가능.
(단, 선언 파일과 선언 클래스 내에서는 사용 불가.)

@reportableClassDecorator
class BugReport {
...
  • 클래스 데커레이터는 생성자를 리턴하는 함수.
    (전부를 포함할 필요는 없고, 일부 변경 사항만 적어도 OK)

단, 진짜 클래스타입이 변하는것이 아니기때문에
메서드나 객체로 클래스 내에 추가한 것을 호출할 수는 없음.

근데 꼭 제네릭 타입으로 클래스 데커레이터를 해야하는진 모르겠음.

2.6.3 메서드 데커레이터

메서드 바로 앞에 선언.
메서드의 속성 설명자, 서술자(property descriptro)에 적용됨.
메서드의 정의를 읽거나 수정 가능.

선언 파일, 오버로드 메서드, 선언 클래스에서 사용 불가.

메서드 데커레이터는 인수를 세 개 가짐.

  • 정적 멤버가 속한 클래스의 생성자 함수이거나, 인스턴스 멤버에 대한 클래스의 프로토 타입.(target)
  • 멤버의 이름(propertyKey)
  • 멤버의 속성 설명자. PropertyDescriptor 타입을 가짐.
interface PropertyDescriptor {
	configuerable : boolean; // 속성 정의 수정 여부.
    enumerabel? : boolean; // 열거형인지 여부
    value? : any; // 속성값
    writable? : boolean; // 수정 가능 여부
    get?(): any; // getter
    set?(v:any):void; // setter
    }

이러한 속성들을 가지고 있음.

음...
전반적으로 보아하니

  • descriptor.value 로 method를 따로 정의해서
    에러 핸들링을 앞에서 정의하고 method를 재호출

하는 방식으로 데커레이터를 구성하는 듯함.

2.6.4 접근자 데커레이터

접근자의 속성 설명자에 적용되고
접근자의 정의를 읽거나 수정이 불가.

역시 선언 파일과 선언 클래스에는 사용 불가.
접근자 데커레이터가 반환하는 값은
해당 멤버의 속성 설명자가 됨.

  • 접근자 :
    객체 프로퍼티를 객체 외에서 읽고 쓸 수 있는 함수.
    타입스크립트에는 게터, 세터를 구현하는 get, set 키워드가 있음.

속성 설명자,
아까 그 위의 구조체의 속성을 변경하여 반영 시킴.
class 안에, class의 속성을 다루는 함수(접근자)의 속성을 변경.

2.6.5 속성 데커레이터

클래스의 속성 바로 앞에 선언.
두 개의 인수를 가짐.

  • target
  • property key

잘 해서
속성에 들어온 멤버의 값...을 임의로 수정 가능
ex) world를 넣었는데 Hello World가 나오도록.

2.6.6 매개변수 데커레이터

생성자 또는 메서드의 매개변수에 선언되어 적용.

  • target
  • propertyKey
  • parameterIndex
    매개변수가 함수에 몇번째 위치에 선언되었는지를 나타내는 인덱스.

API 요청 매개변수에서
유효성 검사에 많이 사용.

흠...
함수 내에
함수(@데커레이터 매개변수){}
형태로 씀.

target에 속성 형태로 메서드 정의시켜서
함수 내에서 그걸 호출해 forEach로 검사하게 시켰군.

profile
개발자 희망...

0개의 댓글