변수 선언 시 바로 옆에 타입을 지정해 주는 것
const val: number = '123';
// 변수명, 함수명, 객체 속성명 + 콜론(:) + 데이터 타입
const str: string = 'STRING';
const num: number = 123;
const bool: boolean = ture;
const big: bigint = 100n;
const str: 'string' = 'STRING';
const num: 123 = 123;
const bool: ture = ture;
객체라고 해서 : object
라고 명시하는 것은 : any
와 다를바 없이 모호하다.
const obj: object = { // X
str: 'str',
num: 123,
child: {
str: 'str',
num: 123
}
}
객체 리터럴 문법을 사용하여 명확하게 Type을 명시한다.
const obj: {
str: string,
num: number,
child: {
str: 'str',
num: 123
}
} = {
str: 'str',
num: 123,
child: {
str: 'str',
num: 123,
}
}
함수를 할당할 변수에 : Function
(함수 타입)을 선언한다.
const myFn: Function = function() { };
함수 안에 타입을 명시할 경우,
매개변수와 return(반환)하는 부분이 존재하기 때문에 두 개의 타입을 명시해야 한다.
(반환은 타입 추론이 잘 되기 때문에 생략하는 경우도 있지만 매개변수는 꼭 작성하도록 한다.)
function func(매개변수명: 매개변수타입명시): 반환타입명시{
return something;
}
/* ↑ 같은 거 ↓ */
const func = (매개변수명: 매개변수타입명시): 반환타입명시 => {
return something;
}
반환 타입의 경우 타입 추론이 잘 되기 때문에 필히 넣을 필요는 없음
: void
: 반환 타입으로 지정시 아무것도 반환하지 않음function func(num: number, str: string): void{
return num + str; // void는 return 하지 않기 때문에 오류
}
function func(num: number, str: string): number{
return num + str;
}
func(123, 'str');
function func(obj: {num: number, str: string}){
return obj.num + obj.str;
}
func({num: 123, str: 'str'})
: TYPE[]
or : Array[TYPE]
const strArr: string = ['hi', 'im', 'yeahzing']
/* ↑ 같은 거 ↓ */
const strArr: Array<string> = ['hi', 'im', 'yeahzing']
const tuple: [number, string] = [123, 'A']
...TYPE[]
)const tuple: [number, ...string[]] = [123, 'A', 'B', 'C']
// 첫 변수는 number이고 string이 얼마든지 들어올 수 있다는 뜻
리터럴은 데이터(값) 그 자체를 뜻한다.
let letNumber = 123;
const constNumer = 123;
위 변수들의 type을 컴파일러에서 확인해보면,
let은 데이터 타입을 지칭하고 const는 데이터 자체를 지칭(리터럴 타입)한다.
let은 재할당이 가능하여 값이 바뀔 수 있기 때문에 데이터 타입을 지칭하고
const는 재할당이 불가능하기 때문에 값 자체가 변수(리터럴 타입)가 된다.
let nu: null = null; // 값이 없음
const un: undefined = undefined; // 값이 존재하지 않음
console.log(nu == un) // true
console.log(nu === un) // false
++ TypeScript의 strictNullChecks
설정은 개발자가 null 혹은 undefined 값을 참조하는 것을 방지한다.
TypeScript를 사용하려면 데이터 타입을 지정하여 안전하게 사용해야 한다.
: any
는 모든 타입의 집합(절대 사용 지양): any
를 붙이면 JavaScript처럼 사용 가능function func(anyParam){}
타입을 지정하지 않아도 컴파일러에서는 : any
로 받아들인다.
++ TypeScript의 noImplicitAny
설정을 사용해 타입을 명확히 선언하고strict
설정을 사용해 대부분의 오류를 잡을 수 있다.
: any
처럼 모든 값을 허용하지만 상대적으로 엄격unknown
으로 추론하는 경우는 없음 때문에 개발자가 직접 명시: unknown
으로 데이터를 받은 후 assertion or 타입 가드(타입이 맞는지 검증하는 것)와 함께 사용let num: unknown = 99;
// unknown 타입 사용 시
// if문을 사용하여 데이터의 타입 별 제어를 할 수 있음
if (typeof num === 'string'){
num.trim();
} else if (typeof num === 'number'){
num + 1;
}
// assertion : 어떤 타입인지 강제하는 문법
(num as string).trim();
JavaScript에서는 반환이 없는 함수를 암시적으로 undefined를 반환한다.
function test(){}
console.log(test()); // undefined
TypeScript에서도 : void
와 : undefined
가 undefined를 반환하지만 TypeScript에서는 void와 undefined는 다른 것이다.
function testU(): undefined{ return undefined }
function testV(): void{}
console.log(testU()); // undefined
console.log(testV()); // undefined