TS는 두 표현 모두 허용.
다만 이미 타입이 정해진 경우 다른 타입의 값 할당 불가.
let a="string";//implicit가 가독성이 더 좋음
let b:boolean=true;
빈 array의 경우, TS에 어떤 타입의 array인지 명시해줘야 함.
let c:number[]=[];
c.push(3);
값이 들어있는 배열의 경우 암시적으로 표현 가능.
let c = [1, 2];
c.push(3);
const player:{
name:string,
age?:number//number or undefined
}={
name:"wonji"
}
if(player.age&&player.age<10){}
//optional 변수가 존재하는지 확인해야 player.age를 사용할 수 있음
매번 type을 정해줄 필요 없이 여러 번 사용할 type은 미리 선언해둘 수 있음.
재사용성 up.
type Age=number;
type Player={
name:string,
age?:Age
}
const player1g:Player={
name:"wonji"
}
const player2g:Player={
name:"twoji",
age:26
}
function PlayerMaker(name: string): Player {
//arguments는 string 타입의 name이 들어오고
//return 타입은 Player
return {
name: name, //=> name만 써도 됨
};
}
const player3g = PlayerMaker("threeg");
player3g.age=14;
readonly가 선언된 값은 수정불가. 읽기 전용이므로 선언할 때만 할당 가능.
immutability(불변성).
const numbers:readonly number[]=[1,2,3,4];
numbers.push(1);//X
개수와 타입이 정해진 배열을 선언할 수 있음. 단, 규칙을 엄격히 지켜야함.
const player:readonly [string,number,boolean]=["dao",10,true];
player[0]="hi";//X : readonly
player[0]=false;//X : readonly & wrong type
let a:undefined=undefined;
let b:null=null;
타입을 지정해주지 않으면 기본값으로 any가 됨. 아무 타입이나 될 수 있음.
let a=[];//let a:any[]
any를 사용하면 type들 간 호환을 허용해 ts에서 빠져나올 수 있기 때문에 사용하지 않는 것을 추천.
const a:any[]=[1,2,3,4];
const b:any=true;
a+b//1,2,3,4true 출력
api로부터 정해지지 않은 응답을 받을 때, 변수의 타입을 미리 확인하지 못할 때 사용.
사용할 때는 타입을 확인하고 사용해야 함. 타입이 확인된 구간에서는 변수 사용 가능.
let a:unknown;
if(typeof a==='number'){
let b=a+1;//a가 number인지 확인된 구간에서는 사용 가능
}
if(typeof a==='string'){
let b=a.toUpperCase();
}
리턴 값이 없는 함수에서 사용. 타입을 지정하지 않아도 자동으로 인식.
function hello():void{//void 생략 가능
console.log('x')
}
function hello():never{//void 생략 가능
throw new Error("x");
}
function hello(name:string|number){
if(typeof name==="string"){
//string
}else if(typeof name==="number"){
//number
}else{
//never
}