자바스크립트는 동적타이핑언어를 지원한다. (정적타이핑언어가 아니다. -> c나c++은 정적타이핑)
값에 타입이있다.
var x = 'hello'
typeof x // String
정적타이핑 - 코드가 예측 가능하다. 에러가 컴파일타임에 뜬다.
동적타이핑 - 에러가 런타임에 뜬다. (이부분은 정적타이핑이 더 안전한부분), 실수를 유발 할 수 있다. 간편하다.
TypeScript
동적타이핑언어인 자바스크립트를 정적타이핑언어처럼 사용할 수 있게 한다.
프로토타입기반언어인 자바스크립트를 클래스기반언어처럼 사용할 수 있게 한다.(generic, abstract 등)
타입추론 :
title = 'my-app';
title: string = 'my-app'; // 타입스크립트 형식이긴하지만, 타입추론에 의해 이미 string인걸 알고있
위 코드에서 보면 my-app이라는 string이라는 타입이 정해짐(타입추론에 의해)
이후에 title은 string타입으로 적용
**타입스크립트는 컴파일을 한다. 그래서 string이있는곳에 다른타입값을 주면 그때 에러를 잡는다(컴파일타임때)
// 윗 영역에서 아래 영역은 건드려도된다.
@Component({
selector: 'app-root',
template: `
<input type="text">
<div></div>
`,
styles: []
})
// 아래 영역에서 윗 영역을 건드리면 안된다.
export class AppComponent {
title = 'my-app';
num: number;
}
@Component({
selector: 'app-root',
template: `
<input type="text" (keyup.enter)="chageVal(input)" #input>
<div>{{value}}</div>
`,
styles: []
})
export class AppComponent {
value = 'Angular';
chageVal(elem: HTMLInputElement){
this.value = elem.value;
elem.value = '';
}
}
대괄호 : 프로퍼티바인딩
소괄호 : 클래스바인딩
// todo angluar 실습
import { Component } from '@angular/core';
interface Todo {
id: number;
content: string;
completed: boolean;
}
@Component({
selector: 'app-root',
template: `
<input type="text" placeholder="enter todo!" (keyup.enter)="addTodo(input)" #input>
<ul class="todos" *ngFor="let todo of todos">
<li>
<input type="checkbox" [checked]="todo.completed" (change)="toggleTodo(todo.id)">
<span [class.completed]="todo.completed">{{todo.content}}</span>
<button (click)="removetodo(todo.id)">X</button>
</li>
</ul>
<pre>{{todos | json}}</pre>
`,
styles: [`
.completed {
text-decoration: line-through;
}
`]
})
export class AppComponent {
todos: Todo[] = [
{ id: 1, content:'HTML', completed: true },
{ id: 2, content: 'CSS', completed: false },
{ id: 3, content: 'JS', completed: true }
];
// todos: Array<Todo> = [] generic 방법
addTodo(inputElem: HTMLInputElement) {
console.log('addtodo', inputElem);
this.todos = [{id: this.generateid(), content: inputElem.value, completed:false} , ...this.todos]
inputElem.value = '';
}
removetodo(id: number) {
this.todos = this.todos.filter(todo => todo.id !== id);
}
toggleTodo(id: number) {
this.todos = this.todos.map(todo => todo.id === id ? {...todo, completed: !todo.completed}:todo);
}
generateid() {
return this.todos.length ? Math.max(...this.todos.map(todo => todo.id)) + 1 : 1;
}
}
타입스크립트는 자바스크립트의 SuperSet이다. (saas와 유사함)
타입스크립트가 추론할 수 있으면, 굳이 명시하지 않아도 된다.
정적 타이핑의 장점은 코드 가독성, 예측성, 안정성의 향상이라고 볼 수 있는데 이는 대규모 프로젝트에 매우 적합하다.
접근 제한자 안써주면 constructor내에서만 유효한 지역변수로 쓰인다.
class Foo {
/*
접근 제한자가 선언된 생성자 파라미터 x는 클래스 프로퍼티로 선언되고 지동으로 초기화된다.
public이 선언되었으므로 x는 클래스 외부에서도 참조가 가능하다.
*/
constructor(public x: string) { }
}
readonly 키워드
값을 할당할 수 없고 오직 읽기만 가능한 상태 이를 이용해 상수의 선언에 사용
class Foo {
private readonly MAX_LEN: number = 5; // 밖에서도 못보고 상수로써 사용
private readonly MSG: string; // 재할당 불
static 키워드
static 키워드를 클래스 프로퍼티에도 사용할 수 있다.
class Foo {
constructor(prop) {
this.prop = prop;
}
static staticMethod() {
/*
정적 메소드는 this를 사용할 수 없다.
정적 메소드 내부에서 this는 클래스의 인스턴스가 아닌 클래스 자신을 가리킨다.
*/
return 'staticMethod';
}
prototypeMethod() {
return this.prop;
}
}
아래처럼 클래스의 프로퍼티로 사용할 수 있다.
class Foo {
// 생성된 인스턴스의 갯수
static instanceCounter = 0;
constructor() {
// 생성자가 호출될 때마다 카운터를 1씩 증가시킨다.
Foo.instanceCounter++;
}
}
추상클래스
규모가 큰 개발에서 주로 사용된다.
상속을 받게되면 abstract클래스안의 메소드들을 만들어라 라고 강제하는것
반드시 상속을 받아서 클래스를 정의한 후 사용해야한다. (=> 생성자가 불가능하다.)
인터페이스
타입 체크를 위해 사용되며 변수, 함수, 클래스에 사용할 수 있다
인터페이스에 선언된 프로퍼티 또는 메소드의 구현을 강제하여 일관성을 유지할 수 있도록 하는 것이다
interface Todo {
id: number;
content: string;
completed: boolean;
}
// 변수 todo의 타입으로 Todo 인터페이스를 선언하였다.
let todo: Todo;
// 변수 todo는 Todo 인터페이스를 준수하여야 한다.
todo = { id: 1, content: 'typescript', completed: false };
클래스와 인터페이스
클래스 선언문의 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);
선택적 프로퍼티
interface UserInfo {
username: string;
password: string;
age? : number; // ?가 붙으면 있어도 그만 없어도 그만.
address?: string;
}
'패스트캠퍼스 > 수업내용정리' 카테고리의 다른 글
2019-06-24 Angular 디렉티브 (0) | 2019.06.24 |
---|---|
2019-06-17 typescript generic / Angular template, Data binding (0) | 2019.06.17 |
2019-06-11 Single Page Application & Routing (0) | 2019.06.11 |
2019-06-05 실행컨텍스트 (0) | 2019.06.05 |
2019-06-04 mongoDB, Sass (0) | 2019.06.04 |