1) 화살표 표현식을 사용하면 test2의 컨텍스트를 가리키는 변수가 따로 저장되어 있다가 함수 표현식 안에서 this를 참조할 때 가져와서 사용함 this.symbol = 'kang'
functiontest3 (symbol : string) {
this.symbol = symbol;
setInterval(function() {
console.log('test2', this.symbol);
}, 1000);
}
let result3 = new test3('kang');
2) this가 가리키는 객체는 전역 window객체이기 때문에 this.symbol = undefined
정리 :
* Typescript코드를 Typescript컴파일러로 컴파일하면 JavaScript코드가 된다. * Typescript에서는 변수나 함수의 인자,함수의 반환값에 타입을 지정할 수 있다. * 함수를 선언할 때 인자의 기본값을 지정할 수 있고, 생략할 인자도 지정할 수 있다. * 화살표 함수 표현식은 익명함수를 좀 더 간단하게 사용하기 위한 문법이다. * 익명 함수에서 this객체를 사용할 때 가리키는 객체가 애매했던 문제는 화살표 함수 표현식에서 해결되었다.
2. 클래스
- Typescript에서는 클래스에 대한 정의를 메모리에 청사진처럼 만들어두고 인스턴스를 생성할 때마다 불러와서 사용함 - JavaScript와 달리 class, extends 키워드를 지원함 -> 하지만 JavaScript으로 변환하면 결국 프로토타입을 활용한 상속이 됨 (class를 활용하면 클로저를 사용할 때보다 더 간단하게 클래스를 정의할 수 있음!)
classPerson {
name : string;
age : number;
}
var p = new Person();
p.name = 'Kang';
p.age = 1;
인스턴스를 생성할 때 생성자를 사용해서 프로퍼티를 초기활 할 수 있음 (이 생성자는 인스턴스가 생성될 때 한 번만 사용됨)
classPerson {
name : string;
age : number;
constructor( name : string, age : number) {
this.name = name;
this.age = age;
}
}
var p = new Person('Kang', 1);
2-1. 접근 제한자
JavaScript : 클래스 변수나 메소드에 접근 범위를 지정하는 기능이 없음 TypeScript : public, protected, private (기본 : public)
classPerson {
public name : string;
public age : number;
private _ssn : string;
constructor( name : string, age : number, ssn : string) {
this.name = name;
this.age = age;
this._ssn = ssn;
}
}
var p = new Person('Kang', 1, '1234');
console.log(p._ssn); // 클래스 밖에서 호출하고 있기 때문에 에러
private으로 지정하는 변수 -> '_' 붙여서 구분시킴
classPerson {
constructor( pubic name : string, public age : number, private _ssn : string) {
}
}
var p = new Person('Kang', 1, '1234');
생성자에서 접근제한자를 지정할 수 있음
2-2. 메소드
= 클래스 안에 선언된 함수 (일반 함수와 구별)
JavaScript : 메소드 선언하려면 객체의 프로토타입에 함수를 추가 TypeScript : 클래스 문법 사용 -> 객체 기반 언어에서 일반적으로 사용하는 문법으로 메소드 선언 가능
classtestClass {
doSomething (times : number) : void {
...
}
}
let tc = new testClass();
tc.doSomething(11);
static doSomething() -> 정적 클래스 멤버로 만들면 인스턴스를 만들지 않아도 tc.doSometing(11);로 접근 가능
classPerson {
constructor( pubic name : string, public age : number, private _ssn? : string) {
}
getssn() : string {
returnthis._ssn;
}
setssn(value : string) : string {
returnthis._ssn = value;
}
}
var p = new Person('Kang', 1);
p.ssn = '1234'; // setter 실행됨
getter, setter 메소드 생성 -> 클래스 인스턴스 만들고 _ssn값 설정함 ** TypeScript에서는 클래스의 다른 멤버에 접근할 때 this키워드를 생략 할 수 없음
2-3. 상속
JavaScript : 프로토타입을 사용한 객체 기반 상속 지원 TypeScript : extends 키워드 사용해서 클래스 상속 할 수 있음
Employee클래스 -> Person클래스 상속함 - 자식 생성자 정의 -> 부모 생성자 반드시 호출해야함 (this 또는 super[명시적 호출])
정리 :
* Angular는 ES5, ES6 버전의 JavaScript으로 작성할 수 있지만, TypeScript를 사용하는 것이 가장 효율적이다. * TypeScript는 변수의 타입을 지정할 수 있으며, 기본 자료형은 물론이고 커스텀 타입도 사용할 수 있다. 이 타입 정보는 트렌스파일러가 코드를 변환할 때 모두 사라지기 때문에 브라우저에서 이 코드를 실행하는 데에 문제가 없다. * .ts파일을 TypeScript컴파일러로 컴파일하면 .js파일이 만들어진다. 컴파일러는 파일의 변경을 감지하고 자동으로 컴파일하는 워치 모드로 동작할 수 있다. * TypeScript에서 제공하는 클래스 문법을 사용하면 코드의 가독성을 높일 수 있다. TypeScript의 클래스와 상속 개념은 다른 객체 기반 언어와 동일하다. * 클래스 멤버에 접근하는 권한을 제어하기 위해 접근 제한자를 사용할 수 있지만, Java나 C#처럼 엄격하지 않다.
클래스나 함수에 제네릭을 사용할 수 있음 - 전달된 인자가 타입에 맞지 않으면 에러 발생 - 하지만 JavaScript으로 변환되는 코드에서는 제네릭에 대한 정보가 사라지기 때문에 JavaScript코드에서는 에러 발생 안함 (제네릭에 대한 에러는 컴파일 시점에만 발생함)
4. 인터페이스
JavaScript : 인터페이스 지원 안함 TypeScript : 자체적으로 인터페이스 기능 제공함 (interface, implements 키워드 사용) -> 개발 생산성 향상
4-1. 커스텀 타입으로 사용하기
인터페이스 내에 필수 항목으로 사용할 프로퍼티 선언 -> 함수에 전달하는 인자의 형식 고정 TypeScript 컴파일러가 인자의 유효성을 먼저 검사함
interface IPserson {
name : string;
age : number;
ssn? : string;
}
classPerson {
constructor (public config : IPerson) {
... }
}
// IPerson 형태에 맞게 객체 생성 (객체 리터럴 문법)let aPerson : IPerson = {
name : 'Kang',
age : 1,
}
let p = new Person(aPerson);
console.log(p.config.name);
let anEmployee : IPerson = {
name : 'Kang',
age : 11,
location : 'Seoul'
};
IPerson에 정의되어 있는 name, age포함하고 있음 + 추가적으로 location도 정의 -- (가능)
4-2. 추상클래스로 사용하기
메소드 형태만 선언해서 인터페이스 정의, 이후엔 클래스 정의할 때 implements 키워드 사용하면서 인터페이스 지정 -> 추상함수로 선언된 메소드의 몸체를 모두 정의해야함