※ 클래스
class Car{
color : string; //미리 선언해줘야 생성자에서 사용가능
constructor(color : string){
this.color = color;
}
start(){
console.log("start");
}
}
const bmw = new Car("red");
미리 선언 하는 대신 readonly 를 이용하는 방법
class Car{
constructor(readonly color : string){
this.color = color;
}
start(){
console.log("start");
}
}
const bmw = new Car("red");
ES6 에서 클래스는 다른 객체 지향 언어들처럼
접근제한자를 지원하지 않는다.
But 타입스크립트에서는 지원한다.
public(default) | privae | protected
※ 제네릭
제네릭타입은 타입을 일반화 해서 재사용 가능한 컴포넌트를 만들 수 있게 해주는 타입스크립트의 기능이다.
제네릭은 함수, 인터페이스, 클래스 등에서 사용할 수 있으며, 어떤 타입이 들어올지 미리 알 수 없는 경우에 유용하다.
어떤 인자가 들어와도 그대로 반환하는 identity 함수가 있다.
function identity(arg: any): any {
return arg;
}
이 함수는 타입 안정성을 보장하지 않는다. 매개변수의 타입과 반환값이 타입이 동일한 것을 보장할 수 없다.
제네릭을 사용하면 위 함수를 일반화 할 수 있다.
function identity<T>(arg: T): T {
return arg;
}
<T> 구문은 제네릭 타입 매개변수를 정의한다.
identity 함수는 T 타입의 값을 받아서 T 타입의 값을 반환하는 함수가 되었다. 이때 T 는 어떤 타입이든 될 수 있다.
let output1 = identity<string>("hello"); //output1 타입은 string
let output2 = identity<number>(123); //output2 타입은 number
여기서 identity 함수를 호출할 때 매개변수의 타입과 반환값의 타입이 일치하게되고,
이를 통해서 타입안정성을 보장할 수 있게 된다
이처럼 제네릭을 사용하면 일반화된 컴포넌트를 만들어서 재사용 할 수 있으며, 타입 안정성을 보장할 수 있다.
function getSize(arr : number[]):number {
return arr.length;
}
const arr = [1,2,3];
getSixe(arr1); //3
매개변수의 type 이 바뀌었는데 동일한 함수를 사용하고 싶다면
: 유니온 타입 사용
function getSize(arr: number[] | string[]): number{ //유니온 타입
return arr.length;
}
const arr2 = ["a","b","c"];
getSize(arr2);
그런데 이렇게 계속 타입을 추가하면 유니온 타입이 너무 길어지지않을까 ?
=> 제네릭 사용
<T> : 타입 파라미터
function getSize<T>(arr: T[]): number{ // 위에서 <T> 선언을 해두고
return arr.length;
}
const arr2 = ["a","b","c"];
getSize<string>(arr2); // 사용하는 시점에서 T 의 type 을 지정해준다, 3
const arr3 = [1,2,3];
getSize<number>(arr3); //3
예제 )

제네릭을 통해서 하나의 인터페이스만 생성하여
각기 다른 객체들을 만들어 줄 수 있음
※ 유틸리티 타입
▷ keyof
interface User{
id: number;
name : string;
age : number;
gender : "m" | "f";
}
type UserKey = keyof User; // 'id' | 'name' | 'age' | 'gender'
const uk : UserKey = "name";
//user interface 의 key 값 중 하나가 들어와야 함
▷ Partial<T>
Partial 은 프로퍼티를 모두 optional 로 바꿔줌
일부만 사용하는 것이 가능
interface User{
id: number;
name : string;
age : number;
gender : "m" | "f";
}
let admin : Partial<User> = {
id : 1,
name : "Bob";
};
//interface User{
// id? :number;
// name? : string;
// age? : numbber;
// gender? : "m" | "f";
//}
유틸리티 타입은 이상 더 많지만 .. 생략하고 추후에 추가로 쓰겠음
'Typescript' 카테고리의 다른 글
| [Typescript] 이펙티브 타입스크립트 2장 아이템13 (0) | 2023.03.05 |
|---|---|
| [Typescript] 이펙티브 타입스크립트 2장 아이템10-12 (0) | 2023.02.27 |
| [Typescript] typeORM (0) | 2022.12.13 |
| [Typescript] 리터럴 타입 / 유니온 타입 / 교차 타입 (0) | 2022.12.03 |
| [Typescript] Type / interface 함수정의 / 함수 type 정의 (0) | 2022.12.03 |