3주차 TypeScript Study 에서는 함수
와 인터페이스
에 대해 배웠습니다
스터디 내용을 복습하면서 인터페이스가 사용되는 경우를 더 알아보았습니다
함수는 타입스크립트로 크게 다음 3가지 타입
을 정의할 수 있다
function sum(a:number,b:number):number {
return a + b;
}
💡 TIP
함수의 반환 값에 타입을 정하지 않을 때는void
사용
타입스크립트에서는 함수의 인자를 모두 필수값
으로 간주한다.
따라서, 함수의 매개변수를 설정하면 undefined
나 null
이라도 인자로 넘겨야한다
매개변수의 갯수 만큼 인자를 넘기지 않아도 되는 자바스크립트의 특성과 반대된다
만약 이러한 특성을 살리고 싶다면 ?
를 이용하면 된다
function sum(a: number, b?: number): number {
return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // error, too many parameters
sum(10); // 타입 에러 없음
함수나 메서드의 매개변수에 기본값
을 할당하는 기능
function myName( firstName: string, lastNmae = 'hwang') {
return firstName + " " + lastName)
}
myName('subin'); // 'subin hwang'
myName('subin', undefined); // 'subin hwang'
myName('subin', 'hwang', 'kim'); // 에러 : 매개변수 과다
함수에 동적인 수의 인수를 전달하고 그들을 배열로 처리, 전개 연산자
를 사용한다
function sum(a:number, ...nums: number[]): number {
let totalOfNums = 0;
for (let key in nums) {
totalOfNums += nums;
}
return a + totalOfNums;
}
일반적으로 타입 체크
를 위해 사용되며 변수, 함수, 클래스에 사용한다
인터페이스는 여러가지 타입을 갖는 프로퍼티
로 이루어진 새로운 타입을 정의하는 것과 유사하다
인터페이스는 변수의 타입
으로 사용할 수 있다.
이때 인터페이스를 타입으로 선언한 변수는 해당 인터페이스를 준수해야 한다
// 인터페이스의 정의
interface Todo {
id: number;
content: string;
completed: boolean;
}
// 변수 todo의 타입으로 Todo 인터페이스를 선언하였다.
let todo: Todo;
// 변수 todo는 Todo 인터페이스를 준수하여야 한다.
todo = { id: 1, content: 'typescript', completed: false };
인터페이스는 함수의 타입
으로 사용할 수 있다.
이때 함수의 인터페이스에는 타입이 선언된 파라미터 리스트
와 리턴 타입
을 정의한다
// 함수 인터페이스의 정의
interface SquareFunc {
(num: number): number;
}
// 함수 인테페이스를 구현하는 함수는 인터페이스를 준수하여야 한다.
const squareFunc: SquareFunc = function (num: number) {
return num * num;
}
console.log(squareFunc(10)); // 100
클래스 선언문의 implements
뒤에 인터페이스를 선언하면 해당 클래스는 지정된 인터페이스를 반드시 구현하여야 한다.
인터페이스를 구현하는 클래스의 일관성
을 유지할 수 있는 장점을 갖는다.
// 인터페이스의 정의
interface ITodo {
id: number;
content: string;
completed: boolean;
}
// Todo 클래스는 ITodo 인터페이스를 구현하여야 한다.
class Todo implements ITodo {
constructor (
public id: number,
public content: string,
public completed: boolean
) { }
}
const todo = new Todo(1, 'Typescript', false);
console.log(todo);
TypeScript
는 해당 인터페이스에서 정의한 프로퍼티나 메소드를 가지고 있다면 그 인터페이스를 구현한 것으로 인정한다. 이것을 덕 타이핑
(duck typing) 또는 구조적 타이핑
(structural typing)이라 한다.
interface IPerson {
name: string;
}
function sayHello(person: IPerson): void {
console.log(`Hello ${person.name}`);
}
const me = { name: 'Hwang', age: 22 };
sayHello(me); // Hello Hwang
인터페이스의 프로퍼티가 선택적
으로 필요한 경우 프로퍼티명 뒤에 ?
를 붙인다
interface UserInfo {
username: string;
password: string;
age? : number;
address?: string;
}
extends
키워드를 사용하여 인터페이스를 상속
받을 수 있다
interface Person {
name: string;
age?: number;
}
interface Student extends Person {
grade: number;
}
const student: Student = {
name: 'Hwang',
age: 22,
grade: 3
}
딱 필요한 정보들만 잘 나누어서 정리해두어서 읽기 너무 편했어요 ! 저는 그 중에서
덕 타이핑
에 대해서는 무지한지라 ,,, 혼자 찾아보고 정리하는 시간을 가졌답니다 ,,덕타이핑이란! 인터페이스를 타입으로 가지지 않아도, 인터페이스의 속성값들을 모두 동일하게 가지고 있는다면 해당 class는 인터페이스 타입 체크를 통과하게 되어 에러가 발생하지 않는다 !
거기에 더해서 왜 'duck'인가 했더니 위키백과에 아주 멋진 말이 있네용
만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.
이 문장으로 한 번에 이해 완 !
부족했던 부분을 찾아볼 수 있게 꼼꼼히 아티클 작성해줘서 고마오요 🥹
+) 아니 목차 아이콘 무슨일이야,, 이 아이 혹시 디자인 파트인가 ? 넘 보기좋다,,,