Javascript를 배우고 있습니다. 매일 배운 것을 이해한만큼 정리해봅니다.
오늘은 Typescript를 정리 해봅니다.
지난 타입스크립트 TIL 기본 개념에 이어서 클래스 선언 시 public/private/protected, Interface 등의 개념을 정리해본다. JS만 하다가 찐OOP 용어들을 만나니 신기하면서 당황스럽다 하하.
Class
문법과 살짝 다른 점이 있다.Class
문법에서는 생성자(contructor) 내부에서 클래스 속성값들을 선언할 수 있다. 그러나 타입스크립트에서는 생성자에서 선언되는 속성값에 대한 타입을 먼저 선언해주어야 한다. 그래서 생성자 함수에 앞서서 사용될 속성값에 대한 타입 선언을 하는 형태이다.// 클래스에서 타입 선언 예시
class Greeter {
greeting: string; // 먼저 타입 선언
constructor(message: string) {
this.greeting = message; // 생성자 함수 안에서 속성 값 할당
}
greet() {
return "Hello, " + this.greeting;
}
}
let greeter = new Greeter("world");
class Animal {
name: string;
constructor(theName: string) {
this.name = theName;
}
move(distanceInMeters: number = 0) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
// 상속 1
class Snake extends Animal {
constructor(name: string) {
super(name);
}
move(distanceInMeters = 5) {
console.log("Slithering...");
super.move(distanceInMeters);
}
}
// 상속 2
class Horse extends Animal {
constructor(name: string) {
super(name);
}
move(distanceInMeters = 45) {
console.log("Galloping...");
super.move(distanceInMeters);
}
}
// instances
let sam = new Snake("Sammy the Python");
let tom: Animal = new Horse("Tommy the Palomino");
sam.move(); // default값 5(number type) 반영
// Slithering...
// Sammy the Python moved 5m.
tom.move(34);
// Galloping...
// Tommy the Palomino moved 34m.
class Animal {
public name: string; // default로 public이므로 삭제 가능
public constructor(theName: string) { // default로 public이므로 삭제 가능
this.name = theName;
}
public move(distanceInMeters: number) { // default로 public이므로 삭제 가능
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Animal {
private name: string;
constructor(theName: string) {
this.name = theName;
}
}
new Animal("Cat").name; // Error: 'name' is private;
class Person {
protected name: string;
protected constructor(theName: string) {
this.name = theName;
}
}
// Person 상속 받기
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name);
this.department = department;
}
public getElevatorPitch() {
return `Hello, my name is ${this.name} and I work in ${this.department}.`;
}
}
// instance화
let howard = new Employee("Howard", "Sales");
let john = new Person("John"); // Error: The 'Person' constructor is protected
class Octopus {
readonly name: string;
readonly numberOfLegs: number = 8;
constructor(theName: string) {
this.name = theName;
}
}
let dad = new Octopus("Man with the 8 strong legs");
dad.name = "Man with the 3-piece suit"; // error! name is readonly.
const fullNameMaxLength = 10;
class Employee {
private _fullName: string;
get fullName(): string {
return this._fullName;
}
set fullName(newName: string) {
if (newName && newName.length > fullNameMaxLength) {
throw new Error("fullName has a max length of " + fullNameMaxLength);
}
this._fullName = newName;
}
}
let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
console.log(employee.fullName);
}
// static method 예시
class Foo {
constructor(prop) {
this.prop = prop;
}
static staticMethod() {
return 'staticMethod';
}
prototypeMethod() {
return this.prop;
}
}
console.log(Foo.staticMethod()); //staticMethod
const foo = new Foo(123);
console.log(foo.staticMethod()); // Uncaught TypeError: foo.staticMethod is not a function
// static property 예시
class Foo {
static instanceCounter = 0;
constructor() {
Foo.instanceCounter++;
}
}
var foo1 = new Foo();
var foo2 = new Foo();
console.log(Foo.instanceCounter); // 2
console.log(foo2.instanceCounter); // error TS2339: Property 'instanceCounter' does not exist on type 'Foo'.
abstract class Animal {
abstract makeSound(): void;
move(): void {
console.log("roaming the earth...");
}
}
interface Todo {
id: number;
content: string;
completed: boolean;
}
let todo: Todo;
todo = { id: 1, content: 'typescript', completed: false };// interface 모양을 그대로 따라 해야만 할당이 가능
?
를 넣어줄 수 있다.interface SquareConfig {
color?: string;
width?: number;
}
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(src: string, sub: string): boolean {
let result = src.search(sub);
return result > -1;
};
interface StringArray {
[index: number]: string;
}
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];
interface ClockInterface {
currentTime: Date;
setTime(d: Date): void;
}
class Clock implements ClockInterface {
currentTime: Date = new Date();
setTime(d: Date) {
this.currentTime = d;
}
constructor(h: number, m: number) {}
}
좋은 글 잘 봤어요! 근데 중간에 protected랑 private이랑 설명이 반대로 되어있는 것 같아요!