Nest는 타입스크립트를 기본언어로 채택한다. javascript로 바꿀 수 있지만, typescript의 장점을 이용하기 위해서 기본설정을 바꾸지 않는것이 좋다.
typescript는 마이크로소프트에서 개발한 언어이다. 자바스크립트 코드에 타입시스템을 도입했다. 따라서 런타임 에러가 발생할 가능성이 있는 코드를 찾아준다. 이때 정적분석(Static Analysis)로 찾아준다고하는데 소스코드를 실행하지 않고 코드만을 분석하여 문제가 될 부분을 찾아내는 기법이다.
타입스크립트는 tsc명령으로 컴파일하여 자바스크립트 코드로 변환이 가능하다. 컴파일 후 생성된 자바스크립트는 타입이 없다. (자바스크립트는 타입이 없기 때문)
변수선언
[선언키워드] [변수명] : [타입]
Typescript에서 변수를 선언하는 방식은 위와 같다.
선언키워드 : const, let, var 등을 이용하여 선언한다.
const - 선언 후 재할당 불가능. let, var - 재할당하여 값을 바꿀 수 있음.
let과 var의 차이는 hoisting 여부이다. var는 변수를 사용한 후에 선언이 가능하지만 let은 그럴 수 없다.
Typescript에서 지원하는 타입
TYPEOF | 내용 | 할당 가능 값 |
boolean | 참, 거짓을 나타내는 논리값 | true, false |
null | '유효하지 않음' | null |
undefined | 값이 존재하지 않음. 변수 선언 후 '값이 할당되지 않음'을 나타냄 | undefined |
number | 배정밀도 64비트 형식 IEEE 754의 값 | - (2^53) 과 2^53 -1사이의 정수와 실수 + Infinity, Infinity NaN |
bigint | Number의 범위를 넘어서는 정수를 저장, 연산 할 수 있게함 | 예) const a = 2n ** 54n; → 정수 끝에 n 을 추가 해준다. |
string | 문자열. 변경불가능 - immutable | 홑따옴표 또는 쌍따옴표로 둘러쌓인 문자열 예) 'hello', "world" |
symbol | 유일하고 변경불가능한 기본값 - immutable primitive value 객체 속성의 키로 사용가능. |
타입스크립트는 자바스크립트가 갖고있는 자료형을 모두 포함한다. 자바스크립트는 Primitive Value와 Object, Function이 있다. typeof 를 사용하여 인스턴스의 타입을 알 수 있다.
객체 타입
객체타입은 Property(속성)을 갖고있는 데이터 컬렉션이다. 이는 C언어 구조체와 유사하다. 속성은 키와 값으로 표현되고, 값은 다시 자바스크립트의 타입을 갖고있다. 따라서 아래와같이 데이터를 구조적으로 표현 할 수 있다.
const player = {
name: 'james',
age: 21,
hobby: ['football', 'jiujitsu'],
}
- 키를 가진 컬렉션 : Map, weakMap은 키와 값을 가지는 객체 타입이고, Set, WeakSet은 유일값들로 이루어진 컬렉션 객체 타입이다.
- 배열(Array): 정수를 키로 가지는 일련의 값을 가진 객체이다. 코드로 표현시 대괄호[]를 이용하여 표현한다.
자바스크립트에 위의 두 가지 보다 다양한 내장객체들이 있다. 'MDN문서 - 표준 내장 객체'를 참고하면 알기 쉽다.
함수(Function)타입
자바스크립트는 다른 함수의 인자로 전달하거나 함수를 변수에 할당 할 수 있다. 또한 함수의 결과로 반환할 수도 있는데 이런 특징을 '일급 함수'라고 한다. 함수 func의 타입을 검사하면 "function"이 된다.
typeof func === "function"
any / unknown / never
타입스크립트에는 특수한 타입들이 있다. any는 자바스크립트와 동일하게 어떠한 값도 받을 수 있다. any타입의 객체 역시 어떤 타입의 변수에도 할당이 가능하다. 이러한 특성이 런타임에 오류를 일으킬 수 있다.
unknown타입은 any처럼 어떤 타입도 할당 가능하지만 다른 변수에 할당 또는 사용할 때 타입을 강제하도록해서 any가 일으키는 오류를 줄여준다.
never타입의 변수에는 어떠한 값도 할당할 수 없다. 함수의 리턴 타입으로 지정하면 함수가 어떤 값도 반환하지 않는다는것을 뜻하고, 아래와 같이 특정타입의 값을 할당받지 못하도록하는데 사용할 수도 있다. 참고로 <T>는 제네릭타입인데 공부하면서 차차 알아가도록하자...
type NonString<T> = T extends string ? never : T;
타입 정의하기
Typescript는 타입을 정의해서 사용이 가능하다. 기본타입과 같은 타입을 정의한다는 뜻은 아니다. 위에서 설명한 타입들을 조합하여 타입에 이름을 붙여 사용한다. vscode를 이용하면 추론된 타입들이 표시됨을 알 수 있다. (변수위에 마우스를 올리면 뜸)
const player = {
name: "James",
age: 18,
}
위 코드의 추론된 타입은 아래와같이 확인가능하다.
const player: {
name: string;
age: number;
}
변수를 객체에 바로 할당하지 않고 interface로 정의할 수 있다. 인터페이스를 이용하여 Player 타입을 선언하는 것이다.
interface Player {
name: string;
age: number;
}
conet player: Player = {
name: "James",
age: 18,
}
interface는 class로 선언 가능하다.
class Player {
constructor(name: string, age: number){}
}
const user: User = new User("James", 18);
타입구성하기
덕 타이핑이라는것이 있다. 자바스크립트 변수에 어떠한 타입의 값도 할당할 수 있는것인데, 타입스크립트도 가능하다. 여러 타입을 조합한 새로운 타입을 갖게 되는것이다.
유니언(Union)타입
여러 타입을 조합한 타입이 유니언 타입이다.
function getLength(obj: string | string[]) {
return obj.length;
}
/* 유니언 타입을 활용하면 변수가 가질 수 있는 값을 제한 할 수 있다. */
type Status = "Ready" | "Waiting";
/* 타입스크립트는 열거형을 제공한다. */
enum Status {
READY = "Ready",
WAITING = "Waiting",
}
제네릭(Generic) 타입
Java, C#에 있는 제네릭과 유사한 기능이다. 어떠한 타입도 정의될 수 있지만 호출되는 시점에 타입이 결정된다.
예를 들어 아래와같이 인자를 그래도 리턴하는 함수가 있다고 한다.
function identity(arg: any): any {
return arg;
}
위 함수의 반환값은 any로 되어있다. 때문에 arg에 'test'를 인자로 전달할 경우 전달한 인자의 string 타입이 반환할때 any가 되어버린다.
반면 다음과 같이 제네릭 타입을 사용하게 되면 리턴되는 값의 타입은 함수를 호출하는 시점의 인자로 넣은 타입으로 결정되도록 할 수 있다.
/* 제네릭 선언시에는 보통 대문자 한글자를 사용한다. */
function indentity<T>(arg: T): T {
return arg;
}
'Javascirpt, Typescript' 카테고리의 다른 글
ts공부하기) typescript 함수 (0) | 2023.10.23 |
---|---|
ts공부하기) 타입스크립트 기본 타입 (0) | 2023.10.20 |
ts 공부하기) 타입 애너테이션 (0) | 2022.12.29 |
Ts 공부하기) TypeScript설치 (0) | 2022.12.28 |
Node.js 공부하기) nodemon 사용하기 (0) | 2022.12.02 |