interface User { // User 이름의 인터페이스로 객체의 키값과 타입을 지정한다
firstName: string
lastName: string
age: number
isValid: boolean
}
const heropy:User = { // 객체 형태의 함수. User를 적용했다
firstName : 'Heropy',
lastName : 'Park',
age: 30,
isValid: true
}
function getFullName(user:User) { //인수에 들어올 데이터 타입을 User로 정했다
return `${user.firstName} ${user.lastName}` // 받은 인수의 객체 정보로 요리한다
}
const fullName = getFullName(heropy) // 리턴 함수에 인수를 넣어줌. 인수는 User 형태에 맞는 것으로.
console.log(fullName) // Heropy Park
console.log(heropy.age) // 30
인터페이스 안에 소괄호로 함수 타입 지정하기.
콜 시그니처는 함수 형식의 타입. type과 다르게 return 값의 타입까지 지정함.
interface GetName {
(message: string): string
}
- 소괄호 안에 매개변수의 타입을 지정할 수 있음!
매개변수의 타입과 개수는 중요하다.
- GetName은 함수 타입!
- 매개변수가 필요할 수 있고, 그것은 메세지이고, 타입은 string이고, 그 함수가 반환하는 값은 string이다.
type GetName {
(message: string): string
}
interface User {
name: string
age: number
getName: (message: string) => string
// getName: GetName 위와 같은 코드임. 재사용 해야한다면 호출시그니처
}
interface Fruits {
[item: number]: string
}
const fruits: Fruits = [‘Apple,’ ‘Banana’, ’Cherry’]
9번강의 8번부터 예시 타이핑 해보기
-> item은 키값이 숫자이고 할당된 값은 문자 데이터이다.
type SuperPrint = {
(arr: number[]) : void;
}
const superPrint:SuperPrint = (arr) => {
arr.forEach(i => console.log(i))
}
superPrint([1,2,3,4])
type SuperPotato = {
<T>(arr: T[]): void // 리턴 있다면 T
}
// T는 배열에서 오고, 함수의 첫번째 파라미터에서 오는거라고 알려준 것
// 위와 다르게 제네릭을 사용한다고 TS에게 알려주기 위해서 <T>를 맨 앞에 붙임. (호칭 상관 X)
// 인수 타입을 concrete type이 아니라 제네릭을 써준다.
// 리턴도 void가 아니가 T를 써줄 수 있음.
const supuerPotato:SuperPotato = (arr) => {
arr.forEach(i => console.log(i))
}
supuerPotato([1,2,true,"stirng"])
function add(a: string, b:string): string // 타입 선언1
function add(a: number, b:number): string // 타입 선언2
function add(a: any, b: any) { // 함수 구현
return a + b
} // 함수 구현부에 any는 매개변수에 모든게 들어올 수 있다는 개념이라기 보다는 오버로딩의 문법을 통해서 위의 타입선언에 해당하는 각각의 매개변수가 함수 구현과 일치하게 만들어줄 수 있는 방법.
add(‘hello’ ,’world~’) // hello world~
add (1, 2) // 3
function toArray<T>(a : T, b : T) {
return [a + b]
}
toArray(’Neo’, ’Sun’) // [‘Neo’, ‘Sun’]
toArray(1, 2) // [1, 2]
제네릭 문법에서의 1. 인터페이스 2. 제약 조건(Constraints) 알아보자.
// 1. 인터페이스
interface MyData<T> {
name: string
value: T
}
const dataA: MyData<string> = {
name: ‘Data A’
value: ‘Hello world’ // 제네릭을 통해 문자 타입으로 만들어야 한다고 정함
}
// 2. 제약조건
interface MyData<T extends string | number> {
name: string
value: T // 타입 변수에 허용할 타입만 extends 키워드를 통해 유니온으로 작성
}
요구한대로 콜 시그니처를 생성해주는 도구. 일일히 여러 타입을 미리 정하지 않아도 됨!
function superTomato<T> (a: T[]) {
return a[0]
}
//사용 예시
type Player<E> = {
name: string
extraInfo: E
// 많은 것들이 있는 큰 타입에서 한 개가 달라질 수 있는 타입이라면 제네릭 사용해서 그 타입을 재사용할 수 있음
}
const nico: Player<{favFood: string}> = {
name: "nico",
extraInfo: {
favFood: "kimchi"
}
}