타입추론은 원시값 (불변한, 객체가 아닌 값들)자체에서 타입을 따로 지정하지 않아도 타입이 지정되는 것
const str = 'string';
const num = 456;
const bool = true;
const obj: {
str: string;
num: number;
student: {
str: string;
num: number;
};
} = {
str: "str",
num: 456,
student: {
str: "str",
num: 456,
},
};
console.log(obj.str);
매개변수와 반환되는 값(void)의 타입을 지정할 수 있다.
function func(num: number, str: string): string {
return num + str;
}
func(123, 'str');
반환되는 값의 타입이 유추가 잘 되기 때문에 무조건 반환타입을 넣어야 할 필요는 없다.
넣지 않는다고 해서 오류가 나지는 않는다.
const func = (str1: string, str2: string) => {
return str1 + ' ' + str2;
}
func('hello', 'world');
인수와 반환되는 값의 타입이 다를 때
function func(num1: number, num2: string): number {
return num1 + Number(num2);
}
func(456, '456');
반환되는 값이 없을 때
function func(num1: number, num2: string): void {
console.log(num1 + num2);
}
func(456, '456');
함수와 객체
const func = (obj: { str1: string, str2: string }) => {
return obj.str1 + ' ' + obj.str2;
}
func({ str1: 'hello', str2: 'world' });
const Arr: string[] = ['str', 'str2', 'str3'];
const Arr1: Array<string> = ['str', 'str2', 'str3'];
const numArr: Array<number> = [4, 5, 6];
const boolArr: boolean[] = [false, true, false, true];
string[ ] 방식과 Array<string> 방식 둘 다 쓰인다.
ex) let
let letStr = 'Hello';
letStr = letStr + ' World';
// output : "Hello World";
ex) const
const constStr = 'Hello';
const constNum = 123;
let은 재할당이 가능하기 때문에 타입이 유지가 되고
const는 재할당이 불가능하기 때문에 타입 대신 값이 리터럴 타입으로 유지가 되는 것이다.
그렇기 때문에 let은 연산이 가능하다.
const arr: string[] = ['A', 'B', 'C'];
const tuple: [number, string] = [5, 'E'];
배열 타입의 길이 조절
const tuple: [number, ...string[]] = [0, 'A', 'B', 'C'];
타입이 맞는지 검증하는 것
ex) typeof
let num: unknown = 68;
if (typeof num === 'string') {
num.trim();
}
any대신 unknown을 쓰는 것이 좋다.