타입스크립트는 자바스크립트의 모든 문법을 포함한다.
따라서 타입스크립트로 개발했더라도 타입 기능을 사용하지 않는다면 자바스크립트 소스나 마찬가지이다.
구문 (Syntax)
// Syntax error TS1005: ')' expected.
let a = (4
타입 (Types)
// Types error TS2363: The right - hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
console.log(4 / []);
런타임 특성 (Runtime Behavior)
Infinity
값을 반환한다.삭제된 타입 (Erased Types)
==
인수를 강제로 변환하여(coerces), 예기치 않은 동작을 유발한다.console.log("" == 0); // true
var foo = 2;
console.log(1< x < 3); // x가 2가 아닌 어떤 값이더라도 항상 true
const obj = { width: 10, height: 15 };
const area = obj.width * obj.heigth; // obj 객체에는 heigth라는 프로퍼티가 없음.
console.log(area); // NaN
function add(num1, num2) {
return num1 + num2;
}
console.log(add(1,"2")); // 12
// if문을 추가해서 입력 타입 검사를 해야함
대부분의 프로그래밍 언어들은 위와같은 오류들이 발생하면 오류를 표출하거나,
코드가 실행되기 전인 컴파일 중 오류를 표출한다.
컴파일러(Complier)란?
- 프로그래밍 언어(고급언어)를 컴퓨터가 이해 할 수 있는 기계어로 변환시키는 과정
- 소스코드 → 바이너리 코드으로 변환
Superset - 기존의 언어에서 가지고 있는 기능을 확장하고 새로운 기능을 추가한 언어를 말한다.
정적 타입 검사자인 타입스크립트는 프로그래을 실행시키기 전에 값의 종류를 기반으로 프로그램의 오류를 찾는다.
즉, 코드 작성과 디버깅을 더욱 편리하게 할 수 있다.
// 오류의 이유는 obj의 타입 때문.
// @errors: 2551
const obj = { width: 10, height: 15 };
const area = obj.width * obj.heigth;
자바스크립트는 동적 타입 언어이며, 변수의 타입을 지정하지 않고 사용할 수 있다.
따라서, 실행 시점에 타입 오류를 찾는다.
let n: number =1
let m = 2 // 타입을 생략해도 대입 연산자(=)의 우항을 분석해 좌항 변수의 타입을 결정함
객체지향 프로그래밍을 구현할 수 있다.
클래스(Class)
인터페이스(Interface)
let tuple: [number, string, boolean] = [7, "hello", true];
// T 매개변수는 배열안에 저장될 타입을 의미
function sumArray<T>(arr: T[]) : T {
let sum = 0;
for (const item of arr) {
sum += item; // 각각의 아이템을 더해서 최종적으로 한 값을 반환
}
return sum;
}
const numbers = [1, 2, 3, 4, 5];
const answer = sumArray<number>(numbers);
console.log(answer); // 15
export
키워드를 사용해 모듈로 만들어서 다른 파일에서 사용.import
키워드 사용// greet.ts
export function greet(name: string) {
return `Hello, ${name}!`;
}
// main.ts
import { greet } from './greet';
console.log(greet('TypeScript'));
greet.ts
파일에서는 greet
함수를 정의하고 export
키워드를 사용하여 외부 모듈에서 사용할 수 있도록 공개.main.ts
파일에서는 greet
함수를 가져오기 위해 import
키워드를 사용한다. 이 파일에서는 greet
함수를 호출하여 결과를 출력한다.// greet.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function greet(name) {
return "Hello, " + name + "!";
}
exports.greet = greet;
// main.js
"use strict";
var greet_1 = require("./greet");
console.log(greet_1.greet('TypeScript'));
namespace MySpace {
export function greet(name: string) {
console.log(`Hello, ${name}!`);
}
}
MySpace.greet("John"); // Output: Hello, John!
let num: number = 10;
if (num > 0) {
console.log(`${num} is positive.`);
} else {
console.log(`${num} is non-positive.`);
}
let color: string = 'red';
switch (color) {
case 'red':
console.log('The color is red.');
break;
case 'blue':
console.log('The color is blue.');
break;
default:
console.log(The color is ${color}.);
break;
}
for (let i: number = 0; i < 10; i++) {
console.log(The value of i is ${i}.);
}
let i: number = 0;
while (i < 10) {
console.log(The value of i is ${i}.);
i++;
}
let i: number = 0;
do {
console.log(`The value of i is ${i}.`);
i++;
} while (i < 10);
const person: { name: string, age: number, location: string } = {
name: 'John Doe',
age: 32,
location: 'Seoul'
};
for (const key in person) {
console.log(${key}: ${person[key]});
}
for (const key in person) {
console.log(${key}: ${person[key]});
}
const numbers: number[] = [1, 2, 3, 4, 5];
for (const number of numbers) {
console.log(`The number is ${number}.`);
}
function add(a: number, b: number): number {
return a + b;
}
number
이며, add
함수의 리턴 타입도 number
.add
함수에 다른 타입의 값이 전달된다면, 컴파일 시점에 타입 오류가 발생.아래의 기능들은 이후 포스트에서 추가 설명 예정
@
기호를 사용하여 적용할 수 있다.function log(target: any, key: string) {
console.log(`${key} 메소드가 호출되었습니다.`);
}
class MyClass {
@log
public myMethod() {
console.log('myMethod 가 호출되었습니다.');
}
}
const myClass = new MyClass();
myClass.myMethod();
// Output: myMethod 메소드가 호출되었습니다.
// myMethod 가 호출되었습니다.
generator
는 자바스크립트와 동일하게 function*
키워드를 사용하여 정의할 수 있다.yield
키워드를 사용하여 값을 반환한다.function* generateSequence(): IterableIterator<number> {
let i = 0;
while (true) {
yield i++;
}
}
const sequence = generateSequence();
console.log(sequence.next().value); // 0
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 2
generateSequence
함수는 무한히 값을 반환하는 generator
다. next
메서드를 호출할 때마다 yield
문에서 정의한 값이 반환된다.|
, 교집합 타입의 기호는 &
를 사용한다.type Shape = Circle | Rectangle;
interface Circle {
type: 'circle';
radius: number;
}
interface Rectangle {
type: 'rectangle';
width: number;
height: number;
}
function area(s: Shape): number {
switch (s.type) {
case 'circle':
return Math.PI * s.radius * s.radius;
case 'rectangle':
return s.width * s.height;
}
}
const c: Circle = {
type: 'circle',
radius: 4
};
const r: Rectangle = {
type: 'rectangle',
width: 10,
height: 5
};
console.log(area(c)); // 50.26548245743669
console.log(area(r)); // 50
Shape
타입은 Circle
타입과 Rectangle
타입의 합집합 타입입니다. area
함수는 Shape
타입의 파라미터를 받아서 각 모양의 면적을 계산합니다. c
와 r
변수는 각각 Circle
타입과 Rectangle
타입입니다.> npm i typescript
> tsc --version
Version 4.9.5
AST(Abstract Syntax tree) : 추상화 문법트리
- 프로그래밍 언어(고급언어)를 컴파일러를 통해 파싱하여서 AST의 자료 구조형태의 코드로 만들어진다.
자바스크립트 코드 -> (타입스크립트 컴파일러로 파싱) -> 타입스크립트 AST 코드 -> (타입 검사기로 체크) -> 자바스크립트 코드 -> (파싱) -> 자바스크립트 AST 코드 -> 바이트 코드 -> (런타임) -> 코드 실행
타입스크립트를 브라우져에서 실행 시키려면 '자바스크립트 코드' 로 변환하여 수행되어야 한다
(타입스크립트만으로는 실행이 불가능하다.)
타입스크립트는 '컴파일' 단계에서 타입을 검사하여 사전에 오류 발견이 가능하다
(자바스크립트 언어의 경우 인터프리티 언어로 ‘런타임' 단계에서 오류가 발견이 된다)
인터프리터(Interpreter)란?
- 프로그래밍 언어(고급언어)를 컴파일 변환 없이 바로 사용하는 언어를 말한다.
- 자바스크립트
타입스크립트 IDE툴(VSCode, IntelliJ, ...)을 설치를 하면 미리 발생 가능한 오류에 대해서 확인이 가능하다.
타입스크립트는 인터프리터 언어가 아닌 컴파일 언어이다.
(자바스크립트는 언어의 변환없는 인터프리터 언어이고, 타입스크립트는 컴파일러가 필요하며 변환이 필요한 컴파일 언어이다)
트랜스 파일러(Transplier)란?
- 한 언어로 작성된 소스코드를 비슷한 수준의 추상화를 가진 다른 언어로 변환하는것을 말한다
- 바벨 (ES6+ 코드를 ES5로 트랜스 파일한다), Typescript(Type+Javascript -> javascript)
input1.value
, input1.value
의 value
속성이 실제로 있는지 확실하지 않음Object is possibly 'null'.ts(2531)
const input1 = document.querySelector("#num1")!;
!
를 추가함으로써 요소를 얻을 것임을 타입스크립트에게 알림(즉, 이것이 결코 null
을 야기하지 않음을 알림)value
속성이 있는지 명확하지 않음Property 'value' does not exist on type 'Element'.ts(2339)
const input1 = document.querySelector("#num1")! as HTMLInputElement;
as HTMLInputElement
을 추가함으로써 input
요소임을 알림function add(num1, num2) {...}
에서 타입스크립트는 num1
, num2
의 안에 무엇이 있는지 알지 못하며 어떤 타입의 값이든 될 수 있음을 알림Parameter 'num1' implicitly has an 'any' type, but a better type may be inferred from usage.ts(7044)
function add(num1: number, num2: number) {...}
처럼 명시적으로 추가할 수 있다.console.log(add(input1.value, input2.value));
의 input1.value
, input2.value
에 error가 발생하는데Argument of type 'string' is not assignable to parameter of type 'number'.ts(2345)
이는 input
요소의 value
속성에서 얻는 것이 문자열이 됨을 알려줌console.log(add(+input1.value, +input2.value));
와 같이 숫자 타입으로 수정해줌.> tsc using-ts.ts
// 컴파일 된 자바스크립트
var btn = document.querySelector("button");
var input1 = document.querySelector("#num1");
var input2 = document.querySelector("#num2");
function add(num1, num2) {
return num1 + num2;
}
btn.addEventListener("click", function () {
console.log(add(+input1.value, +input2.value));
});
// 타입스크립트
const btn = document.querySelector("button")!;
const input1 = document.querySelector("#num1")! as HTMLInputElement;
const input2 = document.querySelector("#num2")! as HTMLInputElement;
function add(num1: number, num2: number) {
return num1 + num2;
}
btn.addEventListener("click", function () {
console.log(add(+input1.value, +input2.value));
});