π TypeScript
π₯ νμ κ³Ό μΈν°νμ΄μ€μ μ°¨μ΄μ β
νμ μ€ν¬λ¦½νΈμμ λͺ λͺ λ νμ μ μ μνλ λ°©λ²μ λ κ°μ§κ° μμ΅λλ€.
type TState = {
name: string;
capital: string;
}
interface IState {
name: string;
capital: string;
}
νμ κ³Ό μΈν°νμ΄μ€ μ¬μ΄μ μ‘΄μ¬νλ μ°¨μ΄λ₯Ό λΆλͺ νκ² μκ³ , κ°μ μν©μμλ λμΌν λ°©λ²μΌλ‘ λͺ λͺ λ νμ μ μ μν΄ μΌκ΄μ±μ μ μ§ν΄μΌ ν©λλ€.
μΈν°νμ΄μ€ μ μΈκ³Ό νμ μ μΈμ λΉμ·ν μ β
λͺ
λͺ
λ νμ
μ μΈν°νμ΄μ€λ‘ μ μνλ νμ
μΌλ‘ μ μνλ μνμλ μ°¨μ΄κ° μμ΅λλ€. λ§μ½ IState
μ TState
λ₯Ό μΆκ° μμ±κ³Ό ν¨κ» ν λΉνλ€λ©΄ λμΌν μ€λ₯κ° λ°μν©λλ€.
μΈλ±μ€ μκ·Έλμ²λ μΈν°νμ΄μ€μ νμ μμ λͺ¨λ μ¬μ©ν μ μμ΅λλ€.
type TDict = {
[key: string]: string
};
interface IDict {
[key: string]: string;
}
λν ν¨μ νμ λ μΈν°νμ΄μ€λ νμ μΌλ‘ μ μν μ μμ΅λλ€.
type TFn = (x: number) => string;
interface IFn {
(x: number): string;
}
const toStrT: TFn = (x) => '' + x;
const toStrT: IFn = (x) => '' + x;
νμ λ³μΉκ³Ό μΈν°νμ΄μ€λ λͺ¨λ μ λλ¦μ΄ κ°λ₯ν©λλ€.
type TPair<T> = {
first: T;
second: T;
}
interface IPair<T> {
first: T;
second: T;
}
μΈν°νμ΄μ€λ νμ μ νμ₯ν μ μμΌλ©°, νμ μ μΈν°νμ΄μ€λ₯Ό νμ₯ν μ μμ΅λλ€.
interface IStateWithPop extends TState {
population: number;
}
type TStateWithPop = IState & { population: number; };
μ¬κΈ°μ μ£Όμν μ μ μΈν°νμ΄μ€λ μ λμ¨ νμ
κ°μ 볡μ‘ν νμ
μ νμ₯νμ§ λͺ»νλ€λ κ²μ
λλ€. 볡μ‘ν νμ
μ νμ₯νκ³ μΆλ€λ©΄ νμ
κ³Ό &
λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
ννΈ ν΄λμ€λ₯Ό ꡬνν λλ, νμ
κ³Ό μΈν°νμ΄μ€ λ λ€ μ¬μ©ν μ μμ΅λλ€.
class StateT implements TState {
name: string = '';
capital: string = '';
}
class StateI implements IState {
name: string = '';
capital: string = '';
}
μΈν°νμ΄μ€ μ μΈκ³Ό νμ μ μΈμ λ€λ₯Έ μ β
μ λμ¨ νμ μ μμ§λ§ μ λμ¨ μΈν°νμ΄μ€λΌλ κ°λ μ μμ΅λλ€.
type AorB = 'a' | 'b';
μΈν°νμ΄μ€λ νμ μ νμ₯ν μ μμ§λ§, μ λμ¨μ ν μ μμ΅λλ€. κ·Έλ°λ° μ λμ¨ νμ μ νμ₯νλ κ² νμν λκ° μμ΅λλ€.
type Input = { /* ... */};
type Output = { /* ... */};
interface VariableMap {
[name: string]: Input | Output;
}
λλ μ λμ¨ νμ
μ name
μμ±μ λΆμΈ νμ
μ λ§λ€ μλ μμ΅λλ€. λ€μκ³Ό κ°μ΅λλ€.
type NamedVariable = (Input | Output) & { name: string };
μ΄ νμ
μ μΈν°νμ΄μ€λ‘ ννν μ μμ΅λλ€. type
ν€μλλ μΌλ°μ μΌλ‘ interface
λ³΄λ€ μ°μμκ° λ§μ΅λλ€. type
ν€μλλ μ λμ¨μ΄ λ μλ μκ³ , 맀νλ νμ
λλ μ‘°κ±΄λΆ νμ
κ°μ κ³ κΈ κΈ°λ₯μ νμ©λκΈ°λ ν©λλ€.
ννκ³Ό λ°°μ΄ νμ
λ type
ν€μλλ₯Ό μ΄μ©ν΄ λ κ°κ²°νκ² ννν μ μμ΅λλ€.
type Pair = [number, number];
type StringList = string[];
type NamedNums = [string, ...number[]];
μΈν°νμ΄μ€λ‘λ ννκ³Ό λΉμ·νκ² κ΅¬νν μ μκΈ°λ ν©λλ€.
interface Tuple {
0: number;
1: number;
length: 2;
}
const t: Tuple = [10, 20]; // μ μ
κ·Έλ¬λ μΈν°νμ΄μ€λ‘ ννκ³Ό λΉμ·νκ² κ΅¬ννλ©΄ ννμμ μ¬μ©ν μ μλ concat
κ°μ λ©μλλ€μ μ¬μ©ν μ μμ΅λλ€. κ·Έλ¬λ―λ‘ ννμ type
ν€μλλ‘ κ΅¬ννλ κ²μ΄ λ«μ΅λλ€.
λ°λ©΄ μΈν°νμ΄μ€λ νμ
μ μλ λͺ κ°μ§ κΈ°λ₯μ΄ μμ΅λλ€. κ·Έμ€ νλλ‘ λ°λ‘ 보κ°(augment)μ΄ κ°λ₯νλ€λ κ²μ
λλ€. μ΄λ² μμ΄ν
μ²μμ λ±μ₯νλ State
μμ μ population
νλλ₯Ό μΆκ°ν λ λ³΄κ° κΈ°λ²μ μ¬μ©ν μ μμ΅λλ€.
interface IState {
name: string;
capital: string;
}
interface IState {
population: number;
}
const wyoming: IState = {
name: 'Wyoming',
capital: 'Cheyenne',
population: 500_000
}; // μ μ
μ΄ μμ μ²λΌ μμ±μ νμ₯νλ κ²μ μ μΈ λ³ν©(declaration merging)μ΄λΌκ³ ν©λλ€. μ μΈ λ³ν©μ μ£Όλ‘ νμ μ μΈ νμΌμμ μ¬μ©λ©λλ€. λ°λΌμ νμ μ μΈ νμΌμ μμ±ν λλ μ μΈ λ³ν©μ μ§μνκΈ° μν΄ λ°λμ μΈν°νμ΄μ€λ₯Ό μ¬μ©ν΄μΌ νλ©° νμ€μ λ°λΌμΌ ν©λλ€. νμ μ μΈμλ μ¬μ©μκ° μ±μμΌ νλ λΉνμ΄ μμ μ μλλ°, λ°λ‘ μ΄ μ μΈ λ³ν©μ΄ κ·Έλ μ΅λλ€.
λ³ν©μ μ μΈμ²λΌ μΌλ°μ μΈ μ½λλΌμ μΈμ λ μ§ κ°λ₯νλ€λ κ²μ μκ³ μμ΄μΌν©λλ€. κ·Έλ¬λ―λ‘ νλ‘νΌν°κ° μΆκ°λλ κ²μ μνμ§ μλλ€λ©΄ μΈν°νμ΄μ€ λμ νμ μ μ¬μ©ν΄μΌ ν©λλ€.
μ 리β
μ΄λ² μμ΄ν
μ μ²μ μ§λ¬ΈμΌλ‘ λμκ° νμ
κ³Ό μΈν°νμ΄μ€ μ€ μ΄λ κ²μ μ¬μ©ν΄μΌ ν μ§ κ²°λ‘ μ λ΄λ € λ³΄κ² μ΅λλ€. 볡μ‘ν νμ
μ΄λΌλ©΄ κ³ λ―Όν κ²λ μμ΄ νμ
λ³μΉμ μ¬μ©νλ©΄ λ©λλ€. κ·Έλ¬λ νμ
κ³Ό μΈν°νμ΄μ€, λ κ°μ§ λ°©λ²μΌλ‘ λͺ¨λ ννν μ μλ κ°λ¨ν κ°μ²΄ νμ
μ΄λΌλ©΄ μΌκ΄μ±κ³Ό 보κ°μ κ΄μ μμ κ³ λ €ν΄ λ³΄μΌ ν©λλ€. μκ΄λκ² μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ μ½λλ² μ΄μ€μμ μμ
νκ³ μλ€λ©΄ μΈν°νμ΄μ€λ₯Ό μ¬μ©νκ³ , μΌκ΄λκ² νμ
μ μ¬μ© μ€μ΄λΌλ©΄ νμ
μ μ¬μ©νλ©΄ λ©λλ€.
μμ§ μ€νμΌμ΄ ν립λμ§ μμ νλ‘μ νΈλΌλ©΄, ν₯μ°μ 보κ°μ κ°λ₯μ±μ΄ μμμ§ μκ°ν΄ λ΄μΌ ν©λλ€. μ΄λ€ APIμ λν νμ
μ μΈμ μμ±ν΄μΌ νλ€λ©΄ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ κ² μ’μ΅λλ€. APIκ° λ³κ²½λ λ μ¬μ©μκ° μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μλ‘μ΄ νλλ₯Ό λ³ν©ν μ μμ΄ μ μ©νκΈ° λλ¬Έμ
λλ€. κ·Έλ¬λ νλ‘μ νΈ λ΄λΆμ μΌλ‘ μ¬μ©λλ νμ
μ μ μΈ λ³ν©μ΄ λ°μνλ κ²μ μλͺ»λ μ€κ³μ
λλ€. λ°λΌμ μ΄λ΄ λλ νμ
μ μ¬μ©ν΄μΌ ν©λλ€.
π₯ μ΄κ±°ν(enum) μ¬μ©μ μ§μν΄μΌνλ μ΄μ β
νμ μ€ν¬λ¦½νΈκ° νλνλ 2010λ κ²½, μλ°μ€ν¬λ¦½νΈλ κ²°ν¨μ΄ λ§κ³ κ°μ ν΄μΌ ν λΆλΆμ΄ λ§μ μΈμ΄μμ΅λλ€. κ·Έλ¦¬κ³ ν΄λμ€, λ°μ½λ μ΄ν°, λͺ¨λ μμ€ν κ°μ κΈ°λ₯μ΄ μμ΄μ νλ μμν¬λ νΈλμ€νμΌλ¬λ‘ 보μνλ κ²μ΄ μΌλ°μ μΈ λͺ¨μ΅μ΄μμ΅λλ€. κ·Έλ κΈ° λλ¬Έμ νμ μ€ν¬λ¦½νΈλ μ΄κΈ° λ²μ μλ λ 립μ μΌλ‘ κ°λ°ν ν΄λμ€, μ΄κ±°ν(enum), λͺ¨λ μμ€ν μ ν¬ν¨μν¬ μλ°μ μμμ΅λλ€.
μκ°μ΄ νλ₯΄λ©° TC39(μλ°μ€ν¬λ¦½νΈλ₯Ό κ΄μ₯νλ νμ€ κΈ°κ΅¬)λ λΆμ‘±νλ μ λ€μ λλΆλΆ λ΄μ₯ κΈ°λ₯μΌλ‘ μΆκ°νμ΅λλ€. κ·Έλ¬λ μλ°μ€ν¬λ¦½νΈμ μλ‘ μΆκ°λ κΈ°λ₯μ νμ μ€ν¬λ¦½νΈ μ΄κΈ° λ²μ μμ λ 립μ μΌλ‘ κ°λ°νλ κΈ°λ₯κ³Ό νΈνμ± λ¬Έμ λ₯Ό λ°μμμΌ°μ΅λλ€. κ·Έλ κΈ°μ νμ μ€ν¬λ¦½νΈ μ§μμμλ λ€μ μ λ΅ μ€ νλλ₯Ό μ νν΄μΌ νμ΅λλ€. ν κ°μ§ μ λ΅μ νμ μ€ν¬λ¦½νΈ μ΄κΈ° λ²μ μ ννλ₯Ό μ μ§νκΈ° μν΄ μλ°μ€ν¬λ¦½νΈ μ κ· κΈ°λ₯μ λ³νν΄μ λΌμ λ§μΆλ κ²μ λλ€. λ λ€λ₯Έ μ λ΅μ μλ°μ€ν¬λ¦½νΈμ μ κ· κΈ°λ₯μ κ·Έλλ‘ μ±ννκ³ νμ μ€ν¬λ¦½νΈ μ΄κΈ° λ²μ κ³Ό νΈνμ±μ ν¬κΈ°νλ κ²μ λλ€.
νμ μ€ν¬λ¦½νΈ νμ λλΆλΆ λ λ²μ¨° μ λ΅μ μ ννμ΅λλ€. κ²°κ΅ TC39λ λ°νμ κΈ°λ₯μ λ°μ μν€κ³ , νμ μ€ν¬λ¦½νΈ νμ νμ κΈ°λ₯λ§ λ°μ μν¨λ€λ λͺ νν μμΉμ μΈμ°κ³ νμ¬κΉμ§ μ§μΌμ€κ³ μμ΅λλ€.
κ·Έλ°λ° μ΄ μμΉμ΄ μΈμμ§κΈ° μ μ, μ΄λ―Έ μ¬μ©λκ³ μλ λͺ κ°μ§ κΈ°λ₯μ΄ μμ΅λλ€. μ΄ κΈ°λ₯λ€μ νμ 곡κ°(νμ μ€ν¬λ¦½νΈ)κ³Ό κ° κ³΅κ°(μλ°μ€ν¬λ¦½νΈ)μ κ²½κ³λ₯Ό νΌλμ€λ½κ² λ§λ€κΈ° λλ¬Έμ μ¬μ©νμ§ μλ κ²μ΄ μ’μ΅λλ€. μ¬κΈ°μλ νΌν΄μΌ νλ κΈ°λ₯μ λͺ κ°μ§ μ΄ν΄λ΄ λλ€. κ·Έλ¦¬κ³ λΆκ°νΌνκ² μ΄ κΈ°λ₯μ μ¬μ©νκ² λλ κ²½μ° μ΄λ€ μ μ μ μν΄μΌ νΈνμ± λ¬Έμ λ₯Ό μΌμΌν€μ§ μλμ§ μμλ΄ λλ€.
μ΄κ±°ν(enum)β
λ§μ μΈμ΄μμ λͺλͺ κ°μ λͺ¨μμ λνλ΄κΈ° μν΄ μ΄κ±°νμ μ¬μ©ν©λλ€. νμ μ€ν¬λ¦½νΈμμλ μ΄κ±° νμ μ¬μ©ν μ μμ΅λλ€.
enum Flavor {
VANILLA = 0,
CHOCOLATE = 1,
STRAWBERRY = 2,
}
let flavor = Flavor.CHOCOLATE; // νμ
μ΄ Flavor
Flavor // μλμμ± μΆμ²: VANILLA, CHOCOLATE, STRAWBERRY
Flavor[0] // κ°μ΄ "VANILLA"
λ¨μν κ°μ λμ΄νλ κ²λ³΄λ€ μ€μκ° μ κ³ λͺ ννκΈ° λλ¬Έμ μΌλ°μ μΌλ‘ μ΄κ±°νμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. κ·Έλ¬λ νμ μ€ν¬λ¦½νΈμ μ΄κ±°νμ λͺ κ°μ§ λ¬Έμ κ° μμ΅λλ€. νμ μ€ν¬λ¦½νΈμ μ΄κ±°νμ λ€μ λͺ©λ‘μ²λΌ μν©μ λ°λΌ λ€λ₯΄κ² λμν©λλ€.
- μ«μ μ΄κ±°ν(μ μμ μ
Flavor
)μ 0, 1, 2 μΈμ λ€λ₯Έ μ«μκ° ν λΉλλ©΄ λ§€μ° μνν©λλ€. (μ΄ λ°©λ²μ μλ λΉνΈ νλκ·Έ ꡬ쑰λ₯Ό νννκΈ° μν΄ μ€κ³λμμ΅λλ€.) - μμ μ΄κ±°νμ 보ν΅μ μ΄κ±°νκ³Ό λ¬λ¦¬ λ°νμμ μμ ν μ κ±°λ©λλ€. μμ μμ λ₯Ό
const enum Flavor
λ‘ λ°κΎΈλ©΄, μ»΄νμΌλ¬λFlavor.CHOCOLATE
μ1
μΌλ‘ λ°κΏ λ²λ¦½λλ€. μ΄λ° κ²°κ³Όλ κΈ°λνμ§ μμ κ²μ΄λ©°, λ¬Έμμ΄ μ΄κ±°νκ³Ό μ«μ μ΄κ±°νκ³Ό μ ν λ€λ₯Έ λμμ λλ€. preserveConstEnums
νλκ·Έλ₯Ό μ€μ ν μνμ μμ μ΄κ±°νμ 보ν΅μ μ΄κ±°νμ²λΌ λ°νμ μ½λμ μμ μ΄κ±°ν μ 보λ₯Ό μ μ§ν©λλ€.- λ¬Έμμ΄ μ΄κ±°νμ λ°νμμ νμ μμ μ±κ³Ό ν¬λͺ μ±μ μ 곡ν©λλ€. κ·Έλ¬λ νμ μ€ν¬λ¦½νΈμ λ€λ₯Έ νμ κ³Ό λ¬λ¦¬ ꡬ쑰μ νμ΄νμ΄ μλ λͺ λͺ©μ νμ΄νμ μ¬μ©ν©λλ€.
νμ μ€ν¬λ¦½νΈμ μΌλ°μ μΈ νμ λ€μ΄ ν λΉ κ°λ₯μ±μ 체ν¬νκΈ° μν΄μ ꡬ쑰μ νμ΄νμ μ¬μ©νλ λ°λ©΄, λ¬Έμμ΄ μ΄κ±°νμ λͺ λͺ©μ νμ΄νμ μ¬μ©ν©λλ€.
ꡬ쑰μ νμ΄νμ κ΅¬μ‘°κ° κ°μΌλ©΄ ν λΉμ΄ νμ©λλ λ°λ©΄, λͺ λͺ©μ νμ΄νμ νμ μ μ΄λ¦μ΄ κ°μμΌ ν λΉμ΄ νμ©λ©λλ€.
enum Flavor {
VANILLA = 'vanilla',
CHOCOLATE = 'chocolate',
STRAWBERRY = 'strawberry',
}
let flavor = Flavor.CHOCOLATE; // νμ
μ΄ Flavor
flavor = 'strawberry';
// ~~~~~ '"strawberry"' νμμ 'Flavor' νμμ ν λΉν μ μμ΅λλ€.ts(2322)
λͺ
λͺ©μ νμ΄νμ λΌμ΄λΈλ¬λ¦¬λ₯Ό 곡κ°ν λ νμν©λλ€. Flavor
λ₯Ό 맀κ°λ³μλ‘ λ°λ ν¨μλ₯Ό κ°μ ν΄ λ΄
μλ€.
function scoop(flavor: Flavor) { /* ... */ }
Flavor
λ λ°νμ μμ μλ λ¬Έμμ΄μ΄κΈ° λλ¬Έμ, μλ°μ€ν¬λ¦½νΈμμ λ€μμ²λΌ νΈμΆν μ μμ΅λλ€.
scoop('vanilla'); // μλ°μ€ν¬λ¦½νΈμμλ μ μ
κ·Έλ¬λ νμ μ€ν¬λ¦½νΈμμλ μ΄κ±°νμ μν¬νΈνκ³ λ¬Έμμ΄ λμ μ¬μ©ν΄μΌ ν©λλ€.
import { Flavor } from 'ice-cream';
scoop(Flavor.VANILLA);
μ΄μ²λΌ μλ°μ€ν¬λ¦½νΈμ νμ μ€ν¬λ¦½νΈμμ λμμ΄ λ€λ₯΄κΈ° λλ¬Έμ λ¬Έμμ΄ μ΄κ±°νμ μ¬μ©νμ§ μλ κ²μ΄ μ’μ΅λλ€. μ΄κ±°ν λμ 리ν°λ΄ νμ μ μ λμ¨μ μ¬μ©νλ©΄ λ©λλ€.
type Flavor = 'vanilla' | 'chocolate' | 'strawberry';
let flavor: Flavor = 'chocolate'; // μ μ
리ν°λ΄ νμ μ μ λμ¨μ μ΄κ±°νλ§νΌ μμ νλ©° μλ°μ€ν¬λ¦½νΈμ νΈνλλ μ₯μ μ΄ μμ΅λλ€. κ·Έλ¦¬κ³ νΈμ§κΈ°μμ μ΄κ±°νμ²λΌ μλμμ± κΈ°λ₯μ μ¬μ©ν μ μμ΅λλ€.
π₯ any
μ unknown
μ μ°¨μ΄β
unknown
νμ
μ any
νμ
μΈμ μ΄λ€ νμ
μλ ν λΉν μ μλ€λ κ²μ
λλ€. λ°λ©΄ any
λ never
λ₯Ό μ μΈν λͺ¨λ κ²μ ν λΉ κ°λ₯ν©λλ€.
// error: boolean νμ
μλ unknown νμ
μ ν λΉν μ μμ.
let unknownType: unknown;
let booleanType: boolean = unknownType;
// λ°λλ‘ unknown νμ
μ boolean νμ
μ ν λΉνλ 건 κ°λ₯.
let boolType: boolean = true;
let unknownType: unknown = boolType;
unknown
νμ
μλ μ΄λ€ κ²μ λμ
νλ κ²μ΄ μ ν¨νμ§ μκΈ° λλ¬Έμ any
νμ
λ³΄λ€ λμ± μμ ν©λλ€.
unknown
νμ
μ νλ‘νΌν°μ μ κ·Ό, λ©μλ νΈμΆ, μΈμ€ν΄μ€ μμ±μ ν μ μμ΅λλ€.
// anyλ stringμ΄λΌλ 보μ₯μ΄ μλμ¬λ νΈμΆ κ°λ₯.
let anyValue: any;
anyValue.toUpperCase();
// error: unknownμ λΆκ°λ₯.
let unknownValue: unknown;
unknownValue.toUpperCase();
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μλ unknown
νμ
μ string
μΌλ‘ μ’νμ£Όμ΄μΌν©λλ€.
const unknownArgFunction = (value: unknown) => {
if (typeof value === 'string') {
// stringμΌλ‘ νμ
μ μ’νμ€ λ€ λ©μλλ₯Ό νΈμΆ.
value.toUpperCase();
}
}
νμ
μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ€λ³΄λ©΄ λ€μ΄μ€κ² λ μΈμμ νμ
μ μμΈ‘ν μ μλ κ²½μ°κ° μλλ°, any
νμ
μ μ¬μ©ν λμλ ν΄λ¨Όμλ¬λ₯Ό λ°μνμ μ½μ§λ§, unknown
νμ
μ νμ νμ
μ λ¨Όμ νμΈ ν νμ 무μΈκ°λ₯Ό μλν μ μκΈ° λλ¬Έμ any
νμ
λ³΄λ€ λμ± μμ ν©λλ€.