TIL

241126 TIL

GoJay 2024. 11. 27. 13:19
  • 타입스크립트 공부(타입스크립트 공식 문서)
    • 자바스크립트는 코드가 실행될 때(런타임에) 타입이 결정된다. 자바스크립트의 코드가 어떻게 동작하는지를 알 수 있는 유일한 방법은 직접 호출해 보고 무슨 일이 벌어지는지 직접 보는 것이다. 즉, 코드 작성 시 코드 동작의 예측을 어렵게 만든다는 단점이 있다.
    • 그래서 나온게 타입스크립트(Typescript)다. 타입스크립트 공식 문서에 따르면, 타입스크립트의 목표는 자바스크립트 프로그램의 정적 타입 검사이다.
    • 자바스크립트에서 에러가 발생하지 않는 방식(e.g. 객체에 존재하지 않는 프로퍼티에 접근하기, 에러가 아니라 undefined를 반환)이더라도 정적 타입 시스템에 따라 오류가 발생할 수 있는 경우라면 에러를 발생시키고 이를 알려줘야 한다. 이 역할을 타입스크립트가 수행해 준다.
    • 타입스크립트는 런타임이 아니라, 코드를 작성하는 시점에 에러를 뱉어준다. 그래서, 발생 가능한 오류를 미리 발견할 수 있어 좀 더 안전한 프로그램을 만드는 걸 가능하게 한다.
    • 타입스크립트의 핵심 원칙 중 하나는 타입 검사가 값이 있는 형태에 집중한다는 것이다. 이를 구조적 타입 시스템(Structural Type System)이라고 하며, '덕 타이핑(Duck Typing)' 또는 '구조적 타이핑(Structural Typing)'이라고 부르기도 한다.
    • '구조적 타입 시스템'이란, 타입스크립트가 사용자 정의 타입(type, interface, class 등)을 분석할 때 타입의 이름이 아니라 구조를 통해 타입 검사를 수행한다는 것을 의미한다. AnimalDog처럼 서로 이름이 다른 타입이더라도 name, age처럼 같은 프로퍼티를 갖거나, 또는 포함되는 프로퍼티를 갖는 관계라면 타입이 일치하는 것으로 검사해 준다. 이는 명시적으로 타입의 이름을 정의하고, 이는 특정 타입에 대해 대해 상속이나 인터페이스 구현을 통해서만 관계를 형성할 수 있는 명시적 타입 언어와의 차이가 된다.
    • 타입스크립트를 사용하면 선언하는 변수, 함수, 파라미터, 반환 값 등에 타입을 명시적으로 정의해 둘 수 있다. 하지만, 많은 경우 타입스크립트는 명시적 타입 정의 없이도 타입을 적절하게 추론해 준다. 그리고, 타입스크립트가 어려움 없이 타입을 추론할 수 이 있는 상황에서는 타입 표기를 굳이 적지 않는 것이 권장된다.
    • 물론 많은 경우 타입스크립트는 적절한 타입 추론을 알아서 해주기 때문에 명시적 타입 작성을 생략해 줘도 괜찮지만, 많은 사람이 함께 작업하는 코드이거나 다른 사람이 리팩토링 시 값의 활용을 명시적으로 제한하기 위해 작성해두기도 한다.
    • 타입스크립트는 자바스크립트의 모든 타입(string, number, boolean 등)을 포괄하며, any, never 등 일부 추가적인 타입 또한 제공한다.
    • any는 모든 타입을 나타낼 수 있으며, 모든 타입의 슈퍼이자 서브이다. any를 많이 사용하는 것은 사실상 타입스크립트를 사용하지 않는 것과 다르지 않으며, 가능하면 any는 사용하지 않는 것이 좋다.
    • 함수는 매개변수의 타입과 반환되는 값의 타입을 각각 지정할 수 있다. 매개변수의 타입은 (name: string)과 같은 식으로 괄호 안에 넣고, 반환 값의 타입은 (name: string): string 처럼 괄호 밖에 작성한다.
    • 유니언 타입은 두 개 이상의 타입 중 해당하는 경우를 뜻한다. (string | number)라고 작성하면 문자열 또는 숫자인 타입을 의미한다.
    • 두 개 이상의 타입이 확인되기 때문에, 실제 타입에 해당하는 값을 활용할 때 타입을 좁히는 게 필요할 수 있다. if문을 통해 분기 처리를 할 수 있고, typeof instaceof in 등의 메서드를 활용해 타입을 특정하여 사용하는 게 좋다.
    • 유니언 타입을 리터럴 타입(하나의 값을 갖는 타입)과 함께 사용하면 사용할 수 있는 값을 특정할 수 있다. 예를 들어, person을 나타내는 객체의 프로퍼티 중 특정 프로퍼티를 지칭해 사용하고 싶을 때 (name | age | gender) 같은 형식으로 사용할 수 있다.
    • 객체는 프로퍼티 별로 타입을 지정하려면 코드가 길고 복잡해질 수 있다. 이럴 경우 타입을 변수에 할당하듯이 정의하여 재사용하는 방식으로 사용할 수 있다. 이를 '타입 별칭(alias)'이라고 하며, 타입 별칭을 만드는 방법엔 여러 가지가 있다.
    • 대표적으로 typeinterface가 있다. typeinterface 둘 다 타입을 정의할 수 있는 명령어지만, 타입을 확장하는 방식이나 필드를 추가할 수 있는지 여부 등에 차이가 있다. interface는 클래스와 유사하게 extends 명령어를 사용해 타입을 상속받아 확장할 수 있지만, type은 교집합(Animal & { honey: Boolean }) 형식으로 확장해야 한다. interface는 새 필드를 추가할 수 있지만, type은 한 번 생성된 뒤 변경이 불가능하다.
    • as 키워드로 타입을 단언할 수 있다. 하지만, 타입 단언은 단순히 타입스크립트의 눈을 가리는 것뿐이기 때문에, 실제로 값의 타입이 다른 값이 들어올 경우가 절대로 없는 경우에 한정해서 사용하는 게 좋다.

'TIL' 카테고리의 다른 글

241128 TIL  (1) 2024.11.29
241127 TIL  (1) 2024.11.27
241125 TIL  (0) 2024.11.26
241124 TIL  (1) 2024.11.25
241123 TIL  (0) 2024.11.24