typescript
λ μΌλ° javascript
λ³΄λ€ μ¬λ¬ μ₯μ μ΄ μλ€. μ½λλ₯Ό μ§€λ μλμμ± κΈ°λ₯μ΄λΌλμ§, debug
λ₯Ό μ§νν λ 미리 μλ¬λ₯Ό λ°©μ§ν μ μμ΄ λ°νμ μ μ μ€λ₯λ₯Ό μ¬μ 체ν¬ν μ μλ€. μ΄ μΈμλ μ¬λ¬κ°μ§ μ₯μ μ΄ μ‘΄μ¬νλ€.
typescript
μλ μ¬λ¬κ°μ§ type
μ΄ μ‘΄μ¬νλ€. boolean
, number
, string
, undefined
, null
λ± μ½λλ₯Ό μ§€λ νμ©ν μ μλ λ€μν κΈ°λ³Έμλ£νμ΄ μ‘΄μ¬νλ€. μ΄ ν¬μ€νΈμμλ μ΄ κΈ°λ³Έμλ£ν λ§κ³ , typescript
μμ μ νμ©νλ©΄ μ½λ©μ΄ μ¬μμ§λ Generic
μ λν΄μ μμλ³΄λ €κ³ νλ€.
Generic
typescript
λ₯Ό μ²μ μμνμ λ μ¬κΈ°μ κΈ°μ 보μ΄λ©΄ λλ¬Έμ μνλ²³μ΄ λ―μ€κ² λκ»΄μ§λκ° μμλ€. μ΄κ²μ΄ λ°λ‘ generic
μ΄λ€.
generic
(μ λ€λ¦)μ type
μ λΆλ¬Ένκ³ λμνλλ‘ ν type
μ λ§νλ€ (μ€μ?)
μ μΈμμ μ΄ μλλΌ μμ±μμ , ν¨μμ μΈμλ₯Ό λκΈΈλ type
μ λν μ 보λ κ°μ΄ λ겨주λλ‘ νλ κ²μ΄λ€. μ΄λ κ² νλ©΄μ type
μ κ΄ν μ΄λ ν μ 보λ μμ΄λ²λ¦¬μ§ μλλ€.
νλ²μ μ μΈμΌλ‘ λ€μν type
μ μ¬μ¬μ©μ΄ κ°λ₯νλ€λ κ°μ₯ ν° μ₯μ μ΄ μλ€.
Basic μ¬μ©λ²
// function
const returnYourself1 = (param: number): number => param;
const returnYourself2 = (param: any): any => param;
generic
μ μ¬μ©νμ§ μλλ€λ©΄ μ μμμ²λΌ returnYourself1
μ²λΌ νμ
μ μ§μ νκ±°λ, returnYourself2
μ²λΌ any
λ₯Ό μ¬μ©νμ¬ μ½λλ₯Ό μμ±ν μ μλ€.
returnYourself1
λ type
μ μ§μ ν¨μΌλ‘μ¨ μ’ λ μμ μ± μλ μ½λκ° λκ² μ§λ§, number
λ§ λ°μ μ μμΌλ―λ‘ μ¬μ¬μ©μ΄ λΆκ°λ₯νλ€.
returnYourself2
λ any
λ₯Ό μ¬μ©νμ¬ μμ λκ° λμ§λ§ type
μ μ νν μ μκ³ , 리ν΄λλ μλ£νμ μ μκ° μκ² λλ€.
μ΄λ¬ν κ²½μ°μ μ¬μ©νλ κ²μ΄ Generic μ΄λ€.
const returnYourself_generic = <T>(param: T): T => param
T
λ λ€λ₯Έλ»μ μκ³ , generic
μ μ¬μ©ν λ μΌλ°μ μΌλ‘ μ¬μ©νλ κ΄μ©μ μΈ λ³μλͺ
μ΄λ€. μ μ½λμμ μ΄μ ν¨μλ T
λΌλ νμ
μ κ°μ§κ² λλ€. param
μΌλ‘ λ°λ λ³μμ νμ
μ 리ν΄νμ
μΌλ‘ κ·Έλλ‘ κ°μ Έκ°λ κ²μ΄λ€.
ν΄λΉ ν¨μλ₯Ό νΈμΆν λ νμ
μ μ ν΄μ£Όλ©΄ λλ€.
returnYourself_generic<number>(3);
// interfaceμμ μ¬μ©
interface IValue<T> {
value: T;
}
// classμμ μ¬μ©
class Student<T> {
constructor(value: T) {}
}
Multiple Generic
generic
μ νκ° μ΄μμ λ³μλ₯Ό μ¬μ©νλ κ²λ κ°λ₯νλ€.
const generic_two_types = <T, U>(param: T, arg: U): [T, U] => [param, arg];
generic
μ΄ νλλ§ λ λμμλΏ, μ¬μ©νλ λ°©λ²μ νκ°μΌλμ λμΌνλ€. λκ°μ λ³μλ₯Ό λ°μμμ, ν΄λΉ λ³μμ νμ
μ κ°μ§λ array
λ₯Ό 리ν΄νλ€. κ΄μ©μ μΌλ‘ T
μ΄νμ μνλ²³μ λ³μλ‘ μμλλ‘ μ¬μ©νλ©΄ λλ€.
Extends μ΄μ©νκΈ°
generic
μ μ΄λμ λ μ ννμ¬ μμ μ±μ ν보νκΈ° μν΄ extends
λ₯Ό μ¬μ©ν μ μλ€. νμ
μ ν λΏλ§ μλλΌ ide
κ° ν΄λΉ νμ
μ methodλ propertyλ₯Ό μμΈ‘ν μ μκΈ° λλ¬Έμ μλμμ±μ΄ λλ€.
const generic_two_types = <T extends number>(param: T): T => param; // Tλ numberλ₯Ό extendsνμ¬ number μ΄μΈμ νμ
μ λ°μ μ μμ
Arrow function μμ generic μ¬μ©
JSX
λ TSX
νμΌ λ΄μμ generic
μ μ¬μ©ν λ, component
λ₯Ό λ»νλ <>
λ₯Ό λλΆλΆ μ¬μ©νκ² λλλ°, μ΄λ generic
μΌλ‘ μ¬μ©νλ <>
κ³Ό λμΌν λ¬Έμλ₯Ό μ¬μ©νλ€. κ·Έλμ μ΄κ² HTMLμ΄ μλλΌ generic
μ΄λΌλ λͺ
μλ₯Ό νκΈ° μν΄ extends {}
λ₯Ό μ¬μ©νλ€.
extends {}
μ κ²½μ°, generic
νμ
μ΄ objectμ μ νλκΈ° λλ¬Έμ extends unknown
μ μ¬μ©νκΈ°λ νλ€.
const generic_function = <T extends {}>(param: T):T => param;
const generic_unknown = <U extends unknown>(param: U):U => param;
μ 리νλ©΄ generic
μ any
λ³΄λ€ λ μμ νμ§λ§ λμμ μμ λ‘μ΄ flexibleν type μ΄λΌκ³ ν μ μκ² λ€.
μ°Έμ‘°
https://www.typescriptlang.org/docs/handbook/generics.html
https://hyunseob.github.io/2017/01/14/typescript-generic/