함수에 선언된 모든 매개변수가 필수라고 가정한다
function singTwo(first: string, second: string) {
console.log(`${first} / ${second}`);
}
위의 singTwo 함수는 두 개의 매개변수가 필요하고, 두 개의 인수가 들어와야 한다.
함수 내부의 인숫값은 undefined로 기본설정 된다.
function announceSong(song: string, singer?: string) {
console.log(`Song: ${song}`);
if (singer) {
console.log(`Singer: ${singer}`);
}
}
announceSong("mango"); //ok
announceSong("mango", undefined); //ok
announceSong("mango", "sia"); //ok
마지막
매개변수 여야 한다.=
로 선언해줄 수 있다.function rateSont(song: string, rating = 0) {
console.log(`${song} get ${rating}`);
}
rateSong("mango"); //ok
rateSong("mango", 5); //ok
rateSong("mango", undefined); //ok
function logSong(song: string | undefined): void {
if (!Song) {
return; //ok
}
console.log(`${songs}`);
return true; //Error
}
위처럼 void를 사용하면 반환하는 값은 무시된다.
let songLogger: (song: string) => void;
songLogger = (song) => {
console.log(`${songs}`);
};
songLogger("Heart of glass"); //true
위의 songLogger 변수는 song: string을 받고, 값을 반환하지 않는다.
const mango = ["dog", "love"];
mango.push("hi"); //ok
mango.push(true); //error
위의 mango 배열은 초기에 string 값을 포함한다는것을 알고 있으므로 이후에 string 타입은 포함하지만, 다른 데이터는 허용하지않는다.
배열 저장하기 위한 변수도 초깃값이 필요하지 않는다.
변수는 처음에 undefined로 시작해서 나중에 배열 값을 받는다.
let arrayOfNumbers: number[];
arrayOfNumbers = [2, 4, 5];
let createStrings: () => string[]; //string배열을 반환하는 함수
let stringCreaters: () => string[]; //각각의 string을 반환하는 함수 배열
초기에 빈배열로 설정된 변수에서 타입 애너테이션을 포함하지 않으면, 타입스크립트는 배열은 any[]로 취급하고 모든 콘텐츠를 받을 수 있습니다.
이렇게 any타입이 되면, 타입스크립트는 검사 목적을 부분적으로 무효화 하기 때문에, ts는 값의 타입을 알게 할 때 가장 잘 동작한다.
let arrayOfArrayOfNumbers: number[][];
위처럼 나타낼 수 있다.
튜플 : 고정된 크기의 배열 : 각 인덱스에 알려진 특정 타입을 가진다.
보통 튜플 배열 구조 분해 할당을 자주 사용한다.
let [year, warrior] = Math.random() > 0.5 ? [340, "MAngo"] : [1828, "Yeom"];
//year type은 number, warrior type은 string
type Mango = {
born: number;
name: string;
} //타입 별칭으로 구분
interface Mango ={
born: number;
name: string;
} //인터페이스로 구분
인터페이스는 속성 증가를 위해 병합할 수 있다 ( 내장된 전역 인터페이스 또는 npm 패키지와 같은 외부 코드를 사용할때 유용)
인터페이스에서 타입스크립트 타입 검사기가 더 빨리 작동한다.
가능하면 인터페이스 사용을 추천함.
인터페이스를 함수로 선언하는 두 가지 방법
인터페이스 확장
interface Writing {
title: string;
}
interface Novella extends Writing {
pages: number;
}
//Novella 인터페이스는 Writing을 확장하므로 Novella와 Writing의 모든 멤버가 있어야한다.
let myNovella: Novella = {
title: "hi",
pages: 14,
}; //OK
//위의 myNovella에서 멤버를 추가해도 안되고, pages, title 멤버 중에서 하나라도 빠지면 안된다.
이런식으로 여러 인터페이스를 확장하는 방식으로 사용하면 코드 중복을 줄이고 다른 영역에서 더 쉽게 사용이 가능하다.
interface Window {
myEnvironment: string;
}
window.myEnvironment; // 타입 : string