타입스크립트

[타입스크립트] 타입스크립트의 타입, 클래스와 인터페이스

Hyun-danpung2 2022. 12. 20. 23:42
728x90
반응형

타입스크립트의 타입


any 타입

  • 동적 타입
  • 컴파일러가 타입을 확인하지 않음 → 사실상 타입이 없음

unknown 타입

  • unknown으로 타입을 선언하면 해당 변수에 모든 타입의 값을 설정할 수 있고 다른 어떤 타입으로 변경될 수도 있다
  • any 타입과는 다르게 먼저 변수의 유형이 무엇인지 확인하는 과정을 거쳐야 변수의 멤버를 호출하거나 다른 변수의 값으로 설정할 수 있다

인터섹션 타입과 유니온 타입

  • 인터섹션 타입: 최종 객체가 여러 속성을 갖는 것
let obj: {name: string} & {age: number} = {
	name: 'tom',
	age: 25
}
  • 유니온 타입: 최종적으로 하나의 타입을 갖는 것. 아래 예제에서 unionObj는 null 이거나 {name: string} 타입이 된다
let unionObj: null | {name:string} = null;
unionObj = {name: 'jon'};

리터럴 타입

  • 하드코딩한 문자열이나 숫자 값의 집합을 사용하여 해당 값과 같은 값만 변수로 받는다
let literal: "tom" | "linda" | "jeff" | "sue" = "linda";
literal = "sue";
console.log(literal); // 오류 없음
literal = "john";
console.log(literal); // 오류 발생

타입 별칭

  • 타입에 다른 이름을 지정하는 방식
type Points = 20 | 30 | 40 | 50;
let score: Points = 20;

함수 반환 타입

  • 함수에서 어떤 타입이 반환 되는 지 정의
function runMore(distance: number): number {
	return distance + 10;
}

// void
function eat(calories: number){
	console.log("I ate " + calories + "calories"); 
}

function sleepIn(hours: number): void {
	console.log("I selpt " + hours + " hours");
}
let ate = eat(100);
console.log(ate); // undefined 출력
let slept = sleepIn(10);
console.log(slept); // undefined 출력

함수 타입

  • 타입스크립트에서 타입은 전체 함수 시그니처가 될 수 있다
type Run = (miles: number) => boolean;
let runner: Run = function(miles:number): boolean {
	if(miles > 10)
		return true;
	return false;
}
console.log(runner(9)); // false 

never 타입

  • 반환하지 않는 함수 또는 null을 포함하여 아무것도 설정하지 않는 변수
function oldEnough(age: number): never | boolean {
	if(age > 59)
		throw Error("Too old!");
	if(age <= 18)
		return false;

	return true;
}

 

 

클래스와 인터페이스


클래스

  • 접근 제어자: private, readonly
class Person {
	constructor(private msg: string){}
	speak(){
		console.log(this.msg);
	}
}
const tom = new Person("hello");
tom.msg = "hello"; // 오류 발생
tom.speak();
class Person {
	constructor(private readonly msg: string){}
	speak(){
		this.msg = "speak " + this.msg; // 오류 발생
		console.log(this.msg);
	}
}
const tom = new Person("hello");
tom.speak();
  • getter, setter
class Speaker {
	private message: string;
	constructor(private name: string){
	
	}
	get Message(){
		if(!this.message.includes(this.name)){
			throw Error("message is missing speaker's name");
		}
		return this.message;
	}
	set Message(val: string){
		let tmpMessage = val;
		if(!val.includes(this.name)){
			tmpMessage = this.name + " " + val;
		}
		this.message = tmpMessage;
	}
}
  • 정적 속성과 메서드
class ClassA{
	static typeName: string;
	constrctor(){}
	static getFullName(){
		return "ClassA " + ClassA.typename;
	}
}
const a = new ClassA();
console.log(a.typeName);
// 컴파일 실패: typeName이 ClassA의 정적 멤버이기 때문
class ClassA{
	static typeName: string;
	constrctor(){}
	static getFullName(){
		return "ClassA " + ClassA.typename;
	}
}
const a = new ClassA();
console.log(ClassA.typeName);
// 컴파일 성공

인터페이스

  • 타입의 내부 동작을 보여주지 않고 인터페이스를 사용해 시그니처만 보여주는 추상화 방법
  • 규칙의 집합
  • 코드가 동작하려면 해당 규칙을 구현해야 함
interface Employee {
	name: string;
	id: number;
	isManager: boolean;
	getUniqueId: () => string; // 구현 없이 시그니처만 존재
}
const linda: Employee = {
	name: "linda",
	id: 2,
	isManager: false,
	getUniqueId: (): string => {
		let uniqueId = linda.id + "-" + linda.name;
		if(!linda.isManager)
			return "emp-" + uniqueId;
	return uniqueId;
	}
}

const pam: Employee = {
	name: "pam",
	id: 1,
	isManager: true,
	getUniqueId: (): string => {
		let uniqueId = pam.id + "-" + pam.name;
		if(pam.isManager)
			return "mgr-" + uniqueId;
	return uniqueId;
	}
}

상속

class Vehicle {
	constructor(protected wheelCount: number){}
	showNumberOfWheels(){
		console.log(`moved ${this.wheelCount} miles`);
	}
}

class Motorcyle extends Vehicle{
	constructor(){
		super(2);
	}
	updatedWheelCount(newWheelCount: number){
		this.wheelCount = newWheelCount;
	}
}

class Automobile extends Vehicle{
	constructor(){
		super(4);
	}
}

추상 클래스

  • 인터페이스는 동작하는 코드를 구현하지 않음
  • 클래스는 동작하는 코드를 구현
  • 하나의 객체 타입에서 동작하는 코드와 시그니처가 필요한 경우를 위함
namespace AbstractNamespace{
	abstract class Vehicle {
		constructor(protected wheelCount: number){}
		abstract updateWheelCount(newWheelCount: number): void;
		showNumberOfWheels(){
			console.log(`moved ${this.wheelCount} miles`);
		}
	}
}
class Motorcycle extends Vehicle{
	constructor(){
		super(2);
	}
	updateWheelCount(newWheelCount: number){
		this.wheelCount = newWheelCount;
		console.log(`Motorcyle has ${this.wheelCount}`);
	}
}

class Automobile extends Vehicle{
	constructor(){
		super(4);
	}
	updateWheelCount(newWheelCount: number){
		this.wheelCount = newWheelCount;
		console.log(`Automobile has ${this.wheelCount}`);
	}
	// 오버라이딩
	showNumberOfWheels(){
		console.log(`moved Automobile ${this.wheelCount} miles`);
	}
}

 

 

 

reference: 풀스택 리액트, 타입스크립트, 노드 (데이비드 최 저 / 양정열 역)

728x90
반응형