Typescript는 다른 종류의 값들을 사용할 수 있는 방법이 추가된 타입이 있는 상위 집합이다.
console.log(4 / []); // NaN // 이렇게 작성하면 javascript는 구문적으로 옳기 때문에 NaN을 출력한다. console.log(4 / []); // @errors: 2363 // 하지만 typescript는 배열로 숫자를 나누는 연산이 옳지 않다 판단하여 오류를 발생한다.
만약 javscript를 typescript로 옮기면, 코드를 어떻게 작성했는지에 따라 타입 오류를 볼 수 있따.
- 이는 코드상의 문제 / Typescript의 지나친 보수성
- 이런 오류를 제거하기 위해서는 다양한 TypeScript 구문을 추가하는 방법을 제공한다
Javascript의 다양한 디자인 패턴에 타입을 제공하기 힘들 경우, 명시 가능한 Javascript 언어의 확장을 지원한다.
interface User = { name: "Hayes", id: 0, } // interface로 선언하여 새로운 변수에 적용시킬 수 있다. 똑같은 모양으로 만들어야 하는듯 // --cut-- // case.1 const user: User = { name: "HOYO", id: 123, } // 이렇게 작성하면 위의 interface User가 적용된다 // case.2 const user: User = { username: "HOYO", id: 123, } // 키 값을 interface와 다르게 적용하면 `@errors: 2322`를 보여주면서 경고를 준다
자세한 내용은 Interface에서 이어서
객체들을 조합하여 더 크고 복잡한 객체를 만드는 방법과 유사하게 TypeScript에 타입으로 이를 수행하는 도구가 있다.
유니언 ( Union )
// 유니언은 타입이 여러 타입 중 하나일 수 있음을 선언하는 방법이다. type modal = modal | Unmodal; type OddNumber = 1 | 3 | 5 | 7 | 9; // 위처럼 들어올 수 있는 값의 타입을 여러개로 지정할 수 있다. function getLength(obj: string | string[]) { return obj.length; } // 이런 식이라면 array 또는 string을 받는 함수를 만들 수 있다. function Array(obj: string | string[]) { if (typeof obj === "string") { return [obj]; } }// 위 방식 처럼 `typeof x === "type"`를 사용하여 타입에 해당될 때를 조건으로 줄 수 있다.
제네릭 ( Generic )
Typescript 제네릭 시스템은 타입에 변수를 제공하는 방법이다.
EX) Array => 제네릭이 없는 배열은 어떤 것이든 포함된다. 하지만 제네릭이 있는 배열은 배열 안의 값을 설명할 수 있다.
type StringArray = Array<string>; type NumberArray = Array<number>; type ObjectWithNameArray = Array<{ name: string }>;
자세한 내용은 제네릭에서
Typescript의 핵심 원칙 중 하나는 타입 검사가 값이 있는 형태에 집중한다는 것
구조적 타입 시스테엠에서 두 객체가 같은 형태를 가지면 같은 것으로 간주된다.
interface Point { x: number; y: number; } function printPoint(p: Point) { console.log(`${p.x}, ${p.y}`); } const point = { x: 12, y: 26 }; printPoint(point); // "12, 26" // 이렇게 작동되는 이유는 interface Point와 변수 point가 같은 형태를 가지고 있기 때문이다. // 이런 형태 일치에는 일치시킬 객체의 필드의 하위 집합만 필요하다? const poin3 = { x: 12, y: 26, z: 89 }; printPoint(point3) // "12, 26" => 이는 형태에 맞는 값만 출력하는 구조적 타입 시스템 덕분이다. // 만약 형태가 맞지 않으면 error가 발생한다. // 이는 클래스에서도 동일하게 적용된다 class VirtualPint { x: number; y: number; constructor(x: number, y:number) { this.x = x; this.y = y; } } const newVwpoint = new VirtualPint(13, 56); printPoint(newVwpoint); // "13, 56" => 자세한 내용은 클래스에서
타입스크립트 공식문서를 보면서 공부하기 시작했다. 자바스크립트를 공부하면서 개념에 대한 이해가 코드에서도 나타는 것을 많이 느꼈다. 그렇기에 느리더라도 개념을 다지면서 나아가기 위해 공식문서를 보면서 공부합니다. 다음시간엔 핸드북을 차례대로 살펴볼 예정입니다. Yee!