JSμμλ μΈμμ μμ μκ΄μμ΄ ν¨μλ₯Ό νΈμΆν μ μλ€. νμ§λ§ TSλ ν¨μμ μ μΈλ λͺ¨λ 맀κ°λ³μκ° νμλΌκ³ κ°μ νλ€. ν¨μκ° μλͺ»λ μμ μΈμλ‘ νΈμΆλλ©΄ TSλ νμ μ€λ₯μ ννλ‘ μμλ₯Ό μ κΈ°νλ€.
ν¨μμ μΈμκ° μλͺ»λλ©΄ μ€λ₯λ νμνμ§λ§ μ€νμ λλ λ― ?
ν¨μμμ μ¬μ©λλ λͺ¨λ μ νμ 맀κ°λ³μλ λ§μ§λ§ 맀κ°λ³μμ¬μΌ νλ€. νμ 맀κ°λ³μ μ μ μ νμ 맀κ°λ³μλ₯Ό μμΉμν€λ©΄ λ€μκ³Ό κ°μ΄ TS ꡬ문 μ€λ₯κ° λ°μνλ€.
function announceSinger(singer?: string, song: string){
}
JSμμ μ νμ 맀κ°λ³μλ₯Ό μ μΈν λ =
μ κ°μ΄ ν¬ν¨λ κΈ°λ³Έκ°μ μ 곡ν μ μλ€.
μ¦, μ νμ 맀κ°λ³μμλ κΈ°λ³Έμ μΌλ‘ κ°μ΄ μ 곡λκΈ° λλ¬Έμ ν΄λΉ ts νμ
μλ μ묡μ μΌλ‘ ν¨μ λ΄λΆμ | undefined
μ λμΈ νμ
μ΄ μΆκ°λλ€.
function rateSong(song: string, rating = 0){
console.log(`${song} gets ${rating}/5 stars !`;
}
rateSong("Photograph");
rateSong("Set Fire to the Rain", 5);
λ€μ rateSong ν¨μμμ ratingμ number
νμ
μΌλ‘ μ μΆλμ§λ§, ν¨μλ₯Ό νΈμΆνλ μ½λμμλ μ νμ number | undefined
κ° λλ€.
...
μ€νλ λ μ°μ°μ μ΄μ©
function singAllTheSongs(singer: string, ...songs: string[]){
for(const song of songs){
console.log(`${song}, by ${singer}`);
}
}
tsλ ν¨μκ° λ°νν μ μλ λͺ¨λ κ°λ₯ν κ°μ μ΄ν΄ν΄ ν¨μμ λ°ννμ μ μλ €κ³ λ Έλ ₯νλ€.
λ°λΌμ μΌλ°μ μΌλ‘ ν¨μμ λ°ν νμ μ λͺ μνμ§ μλ κ²μ΄ μ’μ§λ§, νΉμ μν©μμλ λ°ν νμ μ λͺ μνλ λ°©μμ΄ μ μ©ν λκ° μλ€.
function A(songs: string[], count=0): number {
// ~
}
const A = (songs: string[], count=0): number => {
}
νμ΄ν ν¨μμ λΉμ·νκ² =>
λ₯Ό μ΄μ©ν΄ ν¨μμ νμ
μ νννλ€.
let nothingInGivesString: () => string;
λ€μ λ³μ νμ μ 맀κ°λ³μκ° μκ³ string νμ μ λ°ννλ ν¨μλ₯Ό λ»νλ€.
ν¨μλ₯Ό 맀κ°λ³μλ‘ κ°μ§λ ν¨μ
function runOnSongs(getSongAt: (index: number) => string){
// ~ ~
}
function getSongAt(index: number){
return `${index}th song`;
}
λ€μ ν¨μμ λ°ννμ
: stringμ λ°ννλ ν¨μ
or undefined
let maybeReturnsString: (() => string) | undefined;
let singer: (song: string) => string;
singer = function(song) {
// song: string νμ
μΌλ‘ μ μΆλλ€.
return 'Singing: ${song.toUpperCase()}!';
}
λ€μ singer λ³μλ string νμ μ 맀κ°λ³μλ₯Ό κ°λ ν¨μμ΄λ―λ‘ λμ€μ singerκ° ν λΉλλ ν¨μ λ΄μ song 맀κ°λ³μλ stringμΌλ‘ μμΈ‘λλ€.
type StringToNumber = (input: string) => number;
let stringToNumber: StringToNumber;
νμ λ³μΉμ νΉν ν¨μ νμ μ μ μ©νλ€. νμ λ³μΉμ μ΄μ©νλ©΄ λ°λ³΅μ μΌλ‘ μμ±νλ 맀κ°λ³μμ λ°ν νμ μ κ°λ μ½λ 곡κ°μ λ§μ΄ μ μ½ν μ μλ€.
μ΄λ€ κ°λ λ°ννμ§ μλ ν¨μ. return λ¬Έμ΄ μκ±°λ κ°μ λ°ννμ§ μλ return λ¬Έ(return ;
)μ κ°μ§ ν¨μ
ν¨μ νμ μ μΈ μ voidλ₯Ό μ¬μ©νλ©΄ ν¨μμμ λ°νλλ λͺ¨λ κ°μ 무μλλ€.
=> μ¬μ€ js ν¨μλ μ€μ κ°μ΄ λ°νλμ§ μμΌλ©΄ κΈ°λ³ΈμΌλ‘ λͺ¨λ undefined
λ₯Ό λ°ννμ§λ§ void
λ undefined
μ λμΌνμ§ μλ€.
- void : ν¨μμ λ°ν νμ μ΄ λ¬΄μλλ€λ κ²μ μλ―Ένλ€.
- undefined : λ°νλλ 리ν°λ΄ κ°μΌλ‘, μ μλμ§ μμ κ°μ΄ λ°νλλ€λ λ»μ΄λ€.
function returnsVoid(){
return;
}
let lazyValue: string | undefined;
lazyValue = returnsVoid();
// lazyValueλ undefinedλ₯Ό λ°ννλ νμ
μΈλ° μ¬κΈ°μ void νμ
μ κ°μ λ£μΌλ €κ³ νλ μ€λ₯ λ°μ
=> undefined
λ₯Ό ν¬ν¨νλ λμ void νμ
μ κ°μ ν λΉνλ €κ³ νλ©΄ νμ
μ€λ₯κ° λ°μνλ€.
voidλ₯Ό λ°ννλλ‘ μ μΈλ νμ μμΉμ μ λ¬λ ν¨μκ° λ°νλ λͺ¨λ κ°μ 무μνλλ‘ μ€μ ν μ μλ€.
μλ₯Ό λ€μ΄, λ°°μ΄μ λ΄μ₯ forEach λ©μλλ voidλ₯Ό λ°ννλ μ½λ°±μ λ°λλ€. forEachμ μ 곡λλ ν¨μλ μνλ λͺ¨λ κ°μ λ°νν μ μλ€. λ€μ saveRecords ν¨μμ records.push(record)
λ number
(λ°°μ΄μ .push()μμ λ°νλ κ°)λ₯Ό λ°ννμ§λ§, μ¬μ ν newRecords.forEach
μ μ λ¬λ νμ΄ν ν¨μμ λν λ°νκ°μ΄ νμ©λλ€.
const records: string[] = [];
function saveRecords(newRecords: string[]){
newRecords.forEach(record => records.push(record));
}
saveRecords(['21', 'Come On Over', 'The Bodyguard'])
never λ°ν ν¨μλ (μλμ μΌλ‘) νμ μ€λ₯λ₯Ό λ°μμν€κ±°λ 무ν 루νλ₯Ό μ€ννλ ν¨μμ΄λ€.
ν¨μλ₯Ό μ λ λ°ννμ§ μλλ‘ μλνλ €λ©΄ λͺ
μμ : never
νμ
μ λν
μ΄μ
μ μΆκ°ν΄ ν΄λΉ ν¨μλ₯Ό νΈμΆν ν λͺ¨λ μ½λκ° μ€νλμ§ μμμ λνλΈλ€.
λ€μ fail ν¨μλ μ€λ₯λ§ λ°μμν€λ―λ‘ paramμ νμ μ stringμΌλ‘ μ’νμ νμ μ€ν¬λ¦½νΈμ μ μ΄ νλ¦ λΆμμ λμμ€λ€.
function fail(message: string): never {
throw new Error('Invariant failure: ${message}');
}
function workWithUnsafeParam(param: unknown){
if(typeof param !== 'string'){
fail(`param should be a string, not ${typeof param}`)
}
param.toUpperCase();
}
νλμ μ΅μ’ ꡬν μκ·Έλμ²μ κ·Έ ν¨μμ λ³Έλ¬Έ μμ μλ‘ λ€λ₯Έ λ²μ μ ν¨μ μ΄λ¦, 맀κ°λ³μ, λ°ν νμ μΈ μ€λ²λ‘λ μκ·Έλμ²λ₯Ό μ¬λ¬λ² μ μΈν¨μΌλ‘μ¨ λ€μν 맀κ°λ³μλ€λ‘ νΈμΆλλ ν¨μλ₯Ό μ μν μ μλ€.
function createDate(timestamp: number): Date;
function createDate(month: number, day: number, year: number): Date;
function createDate(monthOrTimeStamp: number, day?: number, year?: number){
return day === undefined || year === undefined
? new Date(monthOrTimeStamp)
: new Date(year, monthOrTimeStamp, day);
}
createDate(554356800); // ok
createDate(7, 27, 1987); // ok
createDate(4, 1) // Error
ν¨μ μ€λ²λ‘λλ 볡μ‘νκ³ μ€λͺ νκΈ° μ΄λ €μ΄ ν¨μ νμ μ μ¬μ©νλ μ΅νμ μλ¨μ΄λ€. ν¨μλ₯Ό λ¨μνκ² μ μ§νκ³ κ°λ₯νλ©΄ ν¨μ μ€λ²λ‘λλ₯Ό μ¬μ©νμ§ μλ κ²μ΄ μ’λ€.
μΌλ° ν¨μ
function A(a: string, b: number): number {
// stringκ³Ό numberλ₯Ό λ°μμ numberλ₯Ό λ°ννλ ν¨μ
}
νμ΄ν ν¨μ
const A = (a: string, b: number):number => {
// stringκ³Ό numberλ₯Ό λ°μμ numberλ₯Ό λ°ννλ ν¨μ
}