JavaScript의 superset 언어이다.
왜 type일까 정접 타입 (statically Typed)의 특징을 갖는다 하여 타입 스크립트이다.
반대로 JS는 dynamic typed laguage이다.
이게 무슨 뜻이냐? 바로 함수 선언 시점에는 자료형을 특정짓지 않는다는 것이다.
즉, 타입이 고정되어 있지도 않고 이 함수에서 사용할 타입을 미리 정해두지도 않은 상태에서 전달된 매개 변수를 받아 코드를 실행해보는 것이다.
물론 편리할 수 있겠지만 그만큼 헛점이 많을 수 있고 거대한 프로젝트에서는 어디서 에러가 났는지도 알 수 없게 되어버리면서 최근 TS가 각광받고 있는 것이다.
type을 지정해 줌으로써 선언한 타입의 인자를 설정한 타입의 매개 변수에 할당할 수 없다고 알려주기도 한다.
이를 통해 비슷한 종류의 오류와 의도치 않은 방식의 함수 사용을 잡아낼 수 있다
TS의 또다른 특징은 브라우저에서 실행되지 않는다는 것이다.
그래서 TS=>JS로 컴파일해야한다. 이때 타입 표기는 모두 삭제된다.
그리고 또 컴파일 단계에서 우리가 미처 발견하지 못한 문제점을 찾아 알려준다.
npm tsc
로 TS=>JS 컴파일을 실행한다.
하지만 config 파일 없이 실행하면 오류가 나는데 config파일을 구성해줘야 TS에게 컴파일할 파일을 알려줄 수 있기 때문이다.
npm tsc 파일명
의 명령어로 특정 TS파일만 컴파일하여 JS파일로 받아볼 수 있다.
이때 IDE에서 에러를 내뿜더라도 컴파일을 해준다.
let age : number = 27;
let useName :string = "강정우"
let haveLunch: boolean = false;
이때 특징은 type 표기가 "소문자" 라는 것인데 만약 대문자로 바꿀경우 이는 JS의 Number 객체를 가리키게 되니 주의하자
여기서 우리가 표현하고 싶은 것은 primitive한 원시타입의 일반적인 숫자, 문자타입이라면 소문자로 작성해주어야한다.
null과 undefined 타입도 있지만 무언가를 null로 지정하는 경우는 잘 없다.
예를들어 ‘hobbies’라는 변수를 만들고 null로 지정할 수는 있겠지만 이후에 다른 값을 할당하려고 하면 오류가 발생한다. 따라서 let 변수명 : null
이런 식으로는 잘 사용하지 않는다.
let hobbies: string[] = ["Workout", "Gaming", "Shopping"];
[]
만 붙여주면 된다 단, 이렇게 선언 시 아래 자바 코드와 같이 String밖에 담을 수 없다.String[] beer = {"Kloud", "Cass", "Asahi", "Guinness", "Heineken"};
any
로 선언할 수 있다.let person
person = {
name:"alex",
age:27
}
let person: {
name: string;
age: number;
};
person = {
name:"alex",
age:27
}
person = {
isEmployee:false // <= 에러
}
let people:{
name: string;
age: number;
}[]
[]
를 붙여주면 된다.let course = "hello";
course=5 // <= 에러
let course: string | string[] | number | boolean[] = "hello";
|
파이프 문자를 이용하여 이어 붙여서 지정할 수 있다.type Person = {
name: string;
age: number;
};
let person: Person;
person = {
name: "alex",
age: 27
};
let people: Person[];
‘type’ 예약어를 사용하면 일반적인 자바스크립트에는 없는 키워드이지만 타입스크립트에는 추가되어 있다.
이제 type 키워드 뒤에 원하는 이름을 붙이면, 그게 새로운 타입의 이름된다.
그래서 이 TS파일을 컴파일하면 반환되는 JS파일에서는 해당 코드를 찾아볼 순 없을 것이다.
또한 설정한 타입 뒤에 []
예약어를 사용하여 배열로 만든다음 사용할 수도 있다.
function add() :number
라고 따로 지정하지 않았는데 설정이 되어있는 것을 볼 수 있다. 이는 TS가 반환타입에 의하여 inference했다고 볼 수 있다.const add = (a:number, b:number):string|number => {
return "a + b";
}
만약 반환값을 따로 지정해주지 않았다면 void로 지정이 되는데 null, undefined와 비슷한 개념을 갖지만 void는 항상 함수와 결합하여 사용된다는 특징이 있다.
void는 절대 반환값이 없는다. 만약 void를 반환하는 함수에 반환값을 받아서 작업하려면 undefined로 받아서 작업해야 오류도 안뜨고 작업을 할 수 있다.
const insertAtBeginning = (array:any[], value:any) => {
const newArray = [value, ...array];
return newArray;
}
const testArray=[1,2,3]
const updatedArray = insertAtBeginning(testArray, -1);
updatedArray[0].split("");
즉, any를 사용하면 함수를 호출한 다음 타입스크립트로부터 어떤 지원도 받을 수 없게 된다
그래서 이런 문제점을 해결하기위해 generics라는 기능이 존재한다.
const insertAtBeginning = <T>(array:T[], value:T) => {
const newArray = [value, ...array];
return newArray;
}
const testArray=[1,2,3]
const updatedArray = insertAtBeginning(testArray, -1);
updatedArray[0].split("");
const 함수 = <T extends {toString:Function}>(변수:객체<T>) => {
객체{
필드키1 = 필드벨류1.toString()
}
}
const 함수 = <T,U>(변수1:T, 변수2:U):[T,U] => {
return [v,u]
}