함수 선언과 호출 JavaScript에서 함수는 first-class 객체입니다. 즉, 객체를 다루듯이 함수를 변수에 할당하거나, 함수를 다른 함수로 전달하거나, 함수에서 함수를 반환하거나, 객체와 프로토타입에 할당하거나, 함수에 프로퍼티를 기록하거나, 함수에 기록된 프로퍼티를 읽는 등의 작업을 할 수 있습니다. JavaScript에서 함수로 할 수 있는 일이 정말 많은 덕분에 TypeScript도 이 모든 것을 자신의 타입 시스템에 녹여낼 수 있었습니다. 다음은 TypeScript 예제입니다. function add(a: number, b: number){ return a + b } 보통 함수 매개변수의 타입은 명시적으로 정의합니다. TypeScript는 항상 함수의 본문에서 사용된 타입을 추론하지만 ..
열거형(enum) 열거형(enum)은 해당 타입으로 사용할 수 있는 값을 열거하는 기법입니다. 열거형은 키를 값에 할당하고 순서가 없는 자료구조입니다. 따라서 TypeScript는 키에 접근할 때 주어진 키가 실제 존재하는지 확인할 수 있습니다. 문자열에서 문자열로 매핑하거나 문자열에서 숫자로 매핑하는 열거형, 이렇게 두 가지가 있습니다. 아래의 예시는 열거형의 예입니다. enum Language { English, Spanish, Korean } 열거형의 이름은 단수 명사로 쓰고, 첫 문자는 대문자로 하는 것이 관례입니다. 키도 앞 글자를 대문자로 표시합니다. TypeScript는 자동적으로 열거형의 각 멤버에 적절한 숫자를 추론해 할당하지만, 값을 명시적으로 설정할 수도 있습니다. TypeScript..
유니온과 인터섹션 타입 A, B라는 두 사물이 있을 때 이를 유니온(union; 합집합)하면 둘을 합친 (A나 B에 해당하는 것 전부) 결과가 나오며 인터섹션(intersection; 교집합)하면 둘의 공통부분(A, B 모두에 속하는 것)이 결과로 나옵니다. TypeScript는 타입에 적용할 수 있는 특별한 연산자인 유니온(|)과 인터섹션(&)을 제공합니다. 타입은 집합과 비슷하므로 집합처럼 연산을 수행할 수 있습니다. type Cat = {name: string, purrs: boolean} type Dog = {name: string, barks: boolean, wags: boolean} type CatOrDogOrBoth = Cat | Dog type CatAndDog = Cat & Dog Ca..
타입 별칭 let, const, var로 변수를 선언해서 값 대신 변수로 칭하듯이 타입 별칭으로 타입을 가리킬 수 있습니다. type Age = number type Person = { name: string age: Age } Age는 number입니다. 타입 별칭을 이용하면 Person의 형태를 조금 더 이해하기 쉽게 정의할 수 있습니다. 그러나 TypeScript는 별칭을 추론하진 않으므로 반드시 별칭의 타입을 명시적으로 정의해야 합니다. let age: Age = 24 let girl: Person = { name: 'Cozy Linda', age: age } Age는 number의 별칭이므로 number에도 할당할 수 있습니다. 따라서 코드를 아래처럼 바꿀 수 있습니다. let age = 24 ..
타입 시스템 최신 언어들은 저마다의 타입 시스템을 갖추고 있습니다. 타입 시스템(type system) 타입 검사기가 프로그램에 타입을 할당하는 데 사용하는 규칙 집합 타입 시스템은 어떤 타입을 사용하는지를 컴파일러에 명시적으로 알려주는 타입 시스템과 자동으로 타입을 추론하는 타입 시스템으로 구분되며, 두 시스템은 서로 장단점이 있습니다. TypeScript는 두 가지 시스템 모두의 영향을 받았습니다. 즉, 개발자는 타입을 명시하거나 TypeScript가 추론하도록 하는 방식 중에서 선택할 수 있습니다. 어노테이션을 이용하면, TypeScript에 명시적으로 타입을 지정할 수 있습니다. 어노테이션은 'value: type' 형태로 쓰이며 타입 검사기에게 이 value의 타입은 type이라고 알리는 역할을..
컴파일러 프로그램은 프로그래머가 작성한 다수의 텍스트 파일로 구성됩니다. 해당 텍스트를 컴파일러(compiler)라는 특별한 프로그램이 파싱 하여 추상 문법 트리(Abstract Syntax Tree, AST)라는 자료구조로 변환합니다. AST는 공백, 주석, 그리고 탭 등의 결과를 완전히 무시하고, 다시 AST를 바이트코드(bytecode)라는 하위 수준의 표현으로 변환합니다. 바이트코드가 만들어졌으면 런타임(runtime)이라는 다른 프로그램에 바이트코드를 입력해 평가하고 결과를 얻을 수 있습니다. 즉, 프로그램을 실행하는 것은 컴파일러가 소스 코드를 파싱해 AST로 만들고, 다시 AST를 바이트코드로 변환한 것을 런타임이 평가하도록 지시한다는 의미입니다. 위의 과정을 요약하면, 아래와 같습니다. 프..
bigint bigint는 JavaScript와 TypeScript에 새로 추가된 타입으로, 이를 이용하면 라운딩 관련 에러 걱정 없이 큰 정수를 처리할 수 있습니다. number는 253까지의 정수를 표현할 수 있지만, bigint를 이용하면 이보다 큰 수도 표현할 수 있습니다. bigint 타입은 모든 BigInt의 집합으로 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 비교(
void void는 어떤 타입도 가지지 않는 빈 상태를 의미합니다. 값은 없고, 타입만 있으며, 소문자입니다.(따라서 할당 가능한 값은 undefined입니다.) 명시적으로 아무것도 반환하지 않는 함수의 반환 타입(ex: console.log)을 가리며 이러한 함수의 리턴 타입으로 사용합니다. 그 외에는 사용할 일이 거의 없습니다. function returnVoid(message): void { console.log(message); } returnVoid('리턴이 없슴돠'); let unusable: void = undefined;
never never는 절대 반환하지 않는(예외를 던지거나 영원히 실행되는) 함수 타입을 가리킵니다. never는 리턴에서 사용되며, 리턴에 사용되는 경우, 아래 3가지 정도의 경우가 대부분입니다. function error(message: string): never { throw new Error(message); } function fail() { return error("뭔가 실패했슴다만...?"); } function infiniteLoop(): never { while(true) { } } unknown이 모든 타입의 상위 타입이라면, never는 모든 타입의 서브 타입입니다. 즉, 모든 타입에 never를 할당할 수 있으며, never 값은 어디서든 안전하게 사용할 수 있습니다. 하지만 nev..