2. TypeScript
REPL
TypeScript
Interface vs Type
νμ μΆλ‘
Union Type vs Intersection Type
Optional Parameter
κ°μ μ 리
TypeScript
νμ μ€ν¬λ¦½νΈ 곡μλ¬Έμ
κ°λ¨ν REPLμ μ°κ³ μΆλ€λ©΄ ts-nodeλ₯Ό μ€ν (TS Playgroundλ μ’λ€)
npx ts-node
νμ
μ§μ
νμ μ μ‘μμ£Όλ©΄ νμ μ μ νν λ§λ κ²λ§ ν λΉν μ μλ€.
let name: string;
let age: number;
name = 'νκΈΈλ';
age = 13;
name = 13; // error TS2322: Type 'number' is not assignable to type 'string'.
age = 'νκΈΈλ'; // error TS2322: Type 'string' is not assignable to type 'number'.
let human: {
name: string;
age: number;
};
human = { name: 'νκΈΈλ', age: 13 };
type Human = {
name: string;
age: number;
};
let boy: Human;
boy = { name: 'νκΈΈλ', age: 13 };
interface Person {
name: string;
age: number;
}
let girl: Person;
girl = { name: 'νκΈΈλ', age: 13 };
function add(x: number, y: number): number {
return x + y;
}
add(1, 2);
add('Hello', 'World'); // TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
function sub(x: number, y: number): string {
return x - y; // TS2322: Type 'number' is not assignable to type 'string'.
}
리ν°λ΄ νμ
, Unionμμ μ μ©νκ² μ°μΈλ€.
let category: 'food';
category = 'food';
λ°°μ΄ νμ
let numbers: number[];
let counts: Array<number>;
numbers = [1, 2, 3];
νν νμ
let anythings: any[];
anythings = ['hp', 256];
let pair: [string, number];
pair = ['hp', 256];
νμ
μΆλ‘ , TSμμλ νμ
μΆλ‘ μ κΆμ₯νλ€.
const name: string = 'νκΈΈλ';
const name = 'νκΈΈλ';
Union Type
μ¬λ¬ νμ μ€ νλμ΄λ€.
booleanμ true | falseμ κ°λ€.
type bool = true | false;
let flag: bool;
flag = true;
flag = false;
flag = 3; // TS2322: Type 'number' is not assignable to type 'bool'.
λ§€κ° λ³μλ₯Ό μ ννκ±°λ ν λ λ§€μ° μ μ©νκ² μΈ μ μλ€.
UnionμΌλ‘ νμ μ μ‘μμ£Όλ©΄ μλ μμ±μ΄ λ§€μ° κ°λ ₯νλ€.
type Category = 'food' | 'toy' | 'bag';
function fetchProducts({ category }: { category: Category }) {
console.log(`Fetch ${category}`);
}
λ κ±°μ μ½λ νκ²½μ κ²½μ° κ³μ λ³νκ° μκΈ°κΈ° λλ¬Έμ Unionμ μ μΈ μκ° μλ€.
ReactNodeκ° λνμ μ΄λ€.
let target: string | number;
target = 'νκΈΈλ';
target = 13;
target = null; // TS2322: Type 'null' is not assignable to type 'string | number'.
target = undefined; // TS2322: Type 'undefined' is not assignable to type 'string | number'.
let targetName: string | undefined;
targetName = 'νκΈΈλ';
targetName = undefined;
undefinedλ₯Ό μ§μ μΈ μΌμ μκ³ ν¨μ λ§€κ°λ³μμμ optional νκ² λ°κ³ μΆμ κ²½μ°μ μ¬μ©λ μ μλ€.
νμ§λ§ μ΄λ° κ²½μ°μλ ? κΈ°νΈλ₯Ό μ΄μ©νμ¬ optional parameterλ‘ μ²λ¦¬νλ©΄ undefinedλ κ°μ΄ λ°μ μ μλ€.
function greeting(name?: string): string {
return `Hello, ${name || 'world'}`;
}
κΈ°λ³Έκ°(default parameter)μ μ‘μμ£Όλ©΄ μ’λ€.
function greeting(name: string = 'world'): string {
return `Hello, ${name}`;
}
λ§€κ°λ³μ(parameter)κ° κ°μ²΄(object)μΌ λλ νμ©ν μ μλ€.
function greeting({ name, age }: { name: string; age?: number }): string {
return age ? `${name} (${age})` : name;
}
νμ μ μ‘μμ€ λ°©μ
type Human = {
name: string;
age?: number;
};
function greeting({ name, age }: Human): string {
return age ? `${name} (${age})` : name;
}
greeting(); // TS2554: Expected 1 arguments, but got 0.
greeting({ name: 'νκΈΈλ' });
greeting({ name: 'νκΈΈλ', age: 13 });
Intersection Type
νμ μ νμ₯νλ κ°λ¨ν λ°©μ
type Personμ Humanκ³Ό Creatureμ λͺ¨λ λ§μ‘±ν΄μΌ νλ€.
type Human = {
name: string;
age: number;
};
type Creature = {
hp: number;
mp: number;
};
type Person = Human & Creature;
let person: Person;
person = { name: 'νκΈΈλ', age: 13, hp: 256, mp: 16 };
Generics, Utility Types, and Tips
μ νΈλ¦¬ν° νμ
νΈμ§κΈ° μλ μμ± + κ°λ° νκ²½μμμ μ€λ₯ κ²μ¬
TypeScriptλ₯Ό μ¬μ©νλ ν΅μ¬μ μΈ μ΄μ
μ€λλ λΌμ΄λΈλ¬λ¦¬μ κ²½μ°μ d.ts νμΌλ‘ νμ μ§μ, ν¨ν€μ§ μ΄λ¦μ @types/~ νν
DefinitelyTyped
νΈλλΆ μ λ νκΈ° The Basics μλ°μ€ν¬λ¦½νΈμμ λͺ¨λ κ°μ κ°μ λ°λΌμ μ€νν μ μλ μ°μ°μμ μ§ν©μ΄ μλ€.
message.toLowerCase();
message();
첫 λ²μ§Έ μ½λλ toLowerCase
λΌλ propertyμ μ κ·Όν νμ κ·Έκ²μ νΈμΆνμλ€. λ λ²μ§Έ μ½λλ message
λ₯Ό μ§μ μ μΌλ‘ νΈμΆνμλ€.
κ·Έλ¬λ μ°λ¦¬κ° message
λΌλ κ°μ λͺ¨λ₯Έλ€κ³ κ°μ νλ©΄ (μ€μ λ‘λ κ½€ ννλ€)
μ°λ¦¬λ μ½λλ₯Ό μ€ννμ λ μ΄λ€ κ²°κ³Όκ°μ μ»μ μ μμμ§ νμ€νκ² λ§ν μ μλ€.
κ° μ°μ°μμ νμλ κ°μ΄ 무μμ΄λμ λ¬λ €μλ€.
message
λ νΈμΆν μ μλκ°?toLowerCase
λΌλ νλΌνΌν°λ₯Ό κ°κ³ μλκ°?λ§μ½ κ·Έλ λ€λ©΄,
toLowerCase
λ νΈμΆν μ μλκ°?λ§μ½ λ κ°μ΄ νΈμΆν μ μλ€λ©΄, 무μμ 리ν΄ν κ²μΈκ°?
μ΄ μ§λ¬Έμ λν λ΅μ μΌλ°μ μΌλ‘ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μμ±ν λ μ°λ¦¬κ° 머리μμΌλ‘ μκ°νκ³ μ€μ λ‘ μΌμΉνκΈ°λ₯Ό λ°λλ€.
message
κ° μλμ κ°μ΄ μ μλμλ€κ³ ν΄λ³΄μ.
const message = 'Hello World!';
μΆμΈ‘νκ² μ§λ§, λ§μ½ message.toLowerCase()
λ₯Ό μ€ννλ€λ©΄ μ°λ¦¬λ μλ¬Έμλ‘ λ³νλ λκ°μ λ¬Έμμ΄μ μ»μ μ μλ€.
2λ²μ§Έ μ€μ μ½λλ μ΄λ€κ°? λ§μ½ μλ°μ€ν¬λ¦½νΈμ μΉμνλ€λ©΄ μλ¬μ ν¨κ» μ€ν¨ν κ²μ΄λΌλκ²μ μ κ²μ΄λ€.
TypeError: message is not a function
μ΄λ¬ν μλ¬λ₯Ό νΌν μ μλ€λ©΄ μ’μ κ²μ΄λ€.
μ°λ¦¬κ° μ½λλ₯Ό μ€νν λ, μλ°μ€ν¬λ¦½νΈ λ°νμμ΄ λ¬΄μμ ν μ§ μ ννλ λ°©λ²μ κ°μ νμ
μ μ΄ν΄νλ κ²μ΄λ€,
μ΄λ€ μ’
λ₯μ μ°μ°μμλ₯Ό κ°κ³ μλμ§.
μ΄κ²μ TypeErrorκ° stringμΈ Hello World!
λ ν¨μλ‘ μ€νν μ μλ€λ κ²μ μμν΄μ£Όλ λΆλΆμ΄λ€.
λͺλͺ κ°λ€μ, string
κ³Ό number
μ κ°μ κ°λ€μ λ°νμμ typeof
μ°μ°μλ₯Ό μ΄μ©νμ¬ νμ
μ μλ³ν μ μλ€.
κ·Έλ¬λ ν¨μμ κ°μ λ€λ₯Έ κ°λ€μ λ°νμμ νμ
μ μλ³ν μ μλ λ°©λ²μ΄ μλ€.
μλ₯Ό λ€λ©΄ μλ ν¨μλ₯Ό μκ°ν΄λ³΄μ.
function fn(x) {
return x.flip();
}
μ°λ¦¬λ μ΄ μ½λλ₯΄ μ½μΌλ©΄μ νΈμΆν μ μλ flib
νλΌνΌν°λ₯Ό κ°μ§ κ°μ²΄λ₯Ό λ§€κ°λ³μλ‘ μ λ¬ν΄μΌ
μ΄ ν¨μκ° μ€νλ κ²μ΄λΌλ κ²μ μ μ μλ€.
κ·Έλ¬λ μλ°μ€ν¬λ¦½νΈλ μ½λκ° μ€νλ λ μ΄λ° μ 보λ₯Ό νλ¨ν μ μλ λ°©λ²μ΄ μλ€.
μμ μλ°μ€ν¬λ¦½νΈμμ fn
μ΄ νΉμ κ°μΌλ‘ 무μμ ν μ§ μ μ μλ λ°©λ²μ νΈμΆνκ³ λ¬΄μμ΄ μΌμ΄λλμ§ νμΈνλ κ²μ΄λ€.
μ΄λ¬ν λ°©μμ μ½λλ₯Ό μ€ννκΈ° μ μ μ½λκ° μ΄λ€ νλμ ν κ²μΈμ§ μμΈ‘νκΈ° μ΄λ ΅κ² νλ€, μ¦ μ½λλ₯Ό μμ±ν λ
μμ±νλ μ½λκ° μ΄λ€ μΌμ ν μ§ μκΈ° μ΄λ ΅κ² λ§λ λ€.
μ΄λ° λ°©μμμ λ³Έ κ² μ²λΌ, νμ
μ μ΄λ€ κ°μ΄ fn
μ μ λ¬λ μ μκ³ ,
μ΄λ€ κ°μ μλ¬κ° λ°μν κ²μΈμ§λ₯Ό λ¬μ¬νλ λ°©μμ΄λ€.
μλ°μ€ν¬λ¦½νΈλ μ½λλ₯Ό μ€νν΄μΌλ§ κ²°κ³Όλ₯Ό μ μ μλ λμ νμ΄νμ μ 곡νλ€.
μ΄μ λν λμμ μ μ νμ μμ€ν μ μ¬μ©νλ κ²μ΄λ€. μ½λλ₯Ό μ€ννκΈ° μ μ μ½λκ° μ΄λ»κ² μ€νλ κ²μΈμ§λ₯Ό μμΈ‘ν μ μλ€.
Static type-checking
Everyday Types Narrowing More on Functions Object Types Type Manipulation Classes Modules
Last updated