TypeScript์ ๊ธฐ์ด์ ์ธ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
Typescript ์๊ฐโ
Typescript๋ Javascript์ superset์ผ๋ก, ์ ์ type์ ์ถ๊ฐํ์ฌ Javascript์ ๊ธฐ๋ฅ์ ํ์ฅํฉ๋๋ค. Typescript๋ ๊ธฐ์กด Javascript ์ฝ๋์ ํธํ๋๋ฉด์๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ฝ๊ฒ ์์ฑํ๊ณ ์ ์ง๋ณด์ํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
๋ชฉ์ฐจโ
ํฌ๊ฒ 4๊ฐ์ง๋ก ๋๋์ด ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ๊ณผ ์ ํโ
ํ์ ์คํฌ๋ฆฝํธ์๋ ๋ณ์์ ํ์ ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ํ์ ์ด ์์ต๋๋ค:
number
: ์ซ์string
: ํ ์คํธboolean
: ์ฐธ ๋๋ ๊ฑฐ์งany
: ๋ชจ๋ ์ ํ, ์ ํ์ ์ง์ ํ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ
๋ค์์ ํ์ ์คํฌ๋ฆฝํธ์์ ํ์ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ์์์ ๋๋ค:
let firstName: string = "John";
let age: number = 30;
let isStudent: boolean = false;
arrayโ
ํ์ ์คํฌ๋ฆฝํธ์์ array์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค:
let numbers: number[] = [1, 2, 3];
let names: string[] = ["John", "Jane", "Bob"];
// ๋๋
let numbers: Array<number> = [1, 2, 3];
tupleโ
tuple์ ๊ณ ์ ๋ ๊ธธ์ด์ array์ ๋๋ค. ๊ฐ ์์๋ ํน์ ํ์ ์ ๊ฐ์ง ์ ์์ต๋๋ค.
let person: [string, number] = ["John", 30];
enumโ
enum์ ์ด๋ฆ์ด ์๋ ์์ ์งํฉ์ ๋๋ค.
enum Color {
Red,
Green,
Blue,
}
let c: Color = Color.Green;
anyโ
any๋ ๋ชจ๋ ์ ํ์ ๋ํ๋ ๋๋ค. any๋ ํ์ ๊ฒ์ฌ๋ฅผ ๊ฑด๋๋ฐ๊ธฐ ๋๋ฌธ์, ํ์ ์์ ์ฑ์ ์๊ฒ ๋ฉ๋๋ค.
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
functionโ
ํ์ ์คํฌ๋ฆฝํธ์์ function์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค:
function add(a: number, b: number): number {
return a + b;
}
voidโ
void๋ ๋ฐํ ๊ฐ์ด ์๋ ํจ์์ ๋ฐํ ํ์ ์ ๋๋ค.
function warnUser(): void {
console.log("This is my warning message");
}
null๊ณผ undefinedโ
null๊ณผ undefined๋ ๊ฐ๊ฐ ์์ ์ ํ์ ์ ๊ฐ์ง๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก null๊ณผ undefined๋ ๋ชจ๋ ํ์ ์ ํ์ ํ์ ์ ๋๋ค.
let u: undefined = undefined;
let n: null = null;
neverโ
never๋ ์ ๋ ๋ฐ์ํ์ง ์๋ ๊ฐ์ ๋ํ๋ ๋๋ค. never๋ ํจ์์ ๋ฐํ ํ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
function error(message: string): never {
throw new Error(message);
}
objectโ
object๋ ์์ ํ์ ์ ์ ์ธํ ๋ชจ๋ ํ์ ์ ๋ํ๋ ๋๋ค.
declare function create(o: object | null): void;
create({ prop: 0 }); // OK
create(null); // OK
create(42); // Error
create("string"); // Error
create(false); // Error
create(undefined); // Error
Typesciprt ๊ฐ๋ โ
Type Inferenceโ
Type Inference๋ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ํ์ ์ ์ถ๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํ์ ์คํฌ๋ฆฝํธ๋ ๋ณ์์ ํ์ ์ ์ง์ ํ์ง ์์ผ๋ฉด ๋ณ์์ ํ์ ์ ์ถ๋ก ํฉ๋๋ค.
let a = 1 + 2; // a๋ number ํ์
์ผ๋ก ์ถ๋ก ๋ฉ๋๋ค.
let b = [1, null]; // b๋ (number | null)[] ํ์
์ผ๋ก ์ถ๋ก ๋ฉ๋๋ค.
let c = "abc".substr(1); // c๋ string ํ์
์ผ๋ก ์ถ๋ก ๋ฉ๋๋ค.
Type Assertionsโ
Type Assertions๋ ์ปดํ์ผ๋ฌ์๊ฒ ํน์ ํ์ ์ผ๋ก ํ์ ์ ์ง์ ํ๋๋ก ์ง์ํฉ๋๋ค. Typescript๋ ๊ฐ๋ฐ์๊ฐ ํ์ ์ ์ง์ ํ๋ ๊ฒ์ ํ์ฉํ์ง๋ง, ํ์ ์ ์ง์ ํ๋ ๊ฒ์ ๊ฐ๋ฐ์์ ์ฑ ์์ ๋๋ค.
๋ค์ ๋งํด, ์ปดํ์ผ๋ฌ์๊ฒ "๋ด๊ฐ ์ํค๋ ๋๋ก ํ๋ผ"๋ผ๊ณ ๋จ์ธ(assert)ํ๋ ๊ฒ์ ๋๋ค.
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length; // as ๋ฌธ๋ฒ
// ๋๋
let strLength: number = (<string>someValue).length; // JSX ๋ฌธ๋ฒ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Literal Narrowingโ
Literal Narrowing์ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ฆฌํฐ๋ด ํ์ ์ ์ถ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฆฌํฐ๋ด ํ์ ์ ํ์ ์คํฌ๋ฆฝํธ์์ ํน์ ํ ๊ฐ์ ๋ํ๋ด๋ ํ์ ์ ๋๋ค.
let x: 10 = 10; // x๋ 10์ด๋ผ๋ ๋ฆฌํฐ๋ด ํ์
์ ๊ฐ์ง๋๋ค.
Union Typesโ
Union Types๋ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ฌ๋ฌ ํ์ ์ ํ๋์ ํ์ ์ผ๋ก ํฉ์น๋ ๋ฐฉ๋ฒ์ ๋๋ค.
let x: number | string = 10; // x๋ number ๋๋ string ํ์
์ ๊ฐ์ง๋๋ค.
Type Guardsโ
Type Guards๋ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ํ์ ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํ์ ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- typeof
- instanceof
function isNumber(x: any): x is number {
return typeof x === "number"; // return x instanceof Number;
}
function isString(x: any): x is string {
return typeof x === "string"; // return x instanceof String;
}
function padLeft(value: string, padding: string | number) {
// "number"
if (isNumber(padding)) {
return Array(padding + 1).join(" ") + value;
}
// "string"
if (isString(padding)) {
return padding + value;
}
throw new Error(`Expected string or number, got '${padding}'.`);
}
Type Compatibilityโ
Type Compatibility๋ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ํ์ ์ ํธํ๋๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํ์ ํธํ์ฑ์ ๊ตฌ์กฐ์ ํ์ดํ(structural typing)์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๊ตฌ์กฐ์ ํ์ดํ์ ํ์ ์ด ๊ตฌ์กฐ์ ์ผ๋ก ๊ฐ์ผ๋ฉด ํธํ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
interface Named {
name: string; // name ํ๋กํผํฐ๊ฐ ์์ด์ผ ํฉ๋๋ค.
}
class Person {
name: string; // name ํ๋กํผํฐ๊ฐ ์์ด์ผ ํฉ๋๋ค.
}
let p: Named;
// ๊ตฌ์กฐ์ ํ์ดํ์ด string ํ์
์ ๊ฐ์ง name ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํธํ๋ฉ๋๋ค.
p = new Person();
Type Aliasesโ
Type Aliases๋ ํ์ ์ ์๋ก์ด ์ด๋ฆ์ผ๋ก ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
if (typeof n === "string") {
return n;
} else {
return n();
}
}
Interface์ Classโ
Interfaceโ
Interface๋ ๊ฐ์ฒด์ ๋ชจ์์ ์ ์ํ์ฌ ํน์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋๋ก ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
interface User {
id: number;
name: string;
email: string;
}
const user: User = {
id: 1,
name: "John Doe",
email: "john@example.com",
};
Classโ
Class๋ ํน์ ๊ตฌ์กฐ์ ๋์์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak(): void {
console.log(`My name is ${this.name}`);
}
}
const dog = new Animal("Buddy");
dog.speak(); // ์ถ๋ ฅ : My name is Buddy
Module๊ณผ Namespaceโ
Moduleโ
Module์ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๊ณ ์บก์ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Module์ ๋ณ์, ํจ์, ํด๋์ค ๋ฑ์ ํฌํจํ ์ ์์ต๋๋ค.
export function add(a: number, b: number): number {
return a + b;
}
export function subtract(a: number, b: number): number {
return a - b;
}
import { add } from "./math";
import { subtract } from "./subtraction";
console.log(add(1, 2)); // ์ถ๋ ฅ : 3
console.log(subtract(5, 3)); // ์ถ๋ ฅ : 2
Namespaceโ
Namespace๋ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค. Namespace๋ ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ๊ด๋ จ ๊ธฐ๋ฅ์ ํจ๊ป ๊ทธ๋ฃนํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค:
namespace Geometry {
export interface Point {
x: number;
y: number;
}
export function calculateDistance(p1: Point, p2: Point): number {
const dx = p1.x - p2.x;
const dy = p1.y - p2.y;
return Math.sqrt(dx * dx + dy * dy);
}
}
const point1: Geometry.Point = { x: 0, y: 0 };
const point2: Geometry.Point = { x: 3, y: 4 };
const distance: number = Geometry.calculateDistance(point1, point2);
console.log(distance); // Output: 5