https://typescript-kr.github.io/pages/tutorials/ts-for-oopers.html
위 링크는 typescript의 공식 문서인 TypeScript-Handbook을 한국어로 번역중인 게시글 링크이다. 내가 모르는 부분/재밌는 부분만 추려서 요약을 하려고 했는데 이번에 나약한 타입스크립트 코드를 짰다가 빨리 공부하라는 소리를 들어서 필요한 부분을 정리하려고 한다.
TypeScript-Handbook의 시작하기를 보면 사용하던 언어를 기준으로 Typescript가 어떻게 다를지 설명해준다. 그 중 TS for OOP Programming 부분을 보면, 기존 객체지향언어와 어떻게 다른지를 얘기한다.
TypeScript의 타입 시스템은 오류를 조기에 발견할 수 있게 하고 좀 더 명확히 지시한다는 점에서 JAVA, C++ 같은 정적 타이핑이 가지는 많은 이점을 제공한다.
그러나 TypeScript는 JavaScript와 동일한 런타임을 사용한다. 그러므로 특정한 런타임 동작(문자열을 숫자로 변환하기, 경고 표시, 디스크에 파일 쓰기 등)들이 TypeScript 프로그램에 똑같이 적용된다. TypeScript는 결국 JavaScript로 변환되며 JavaScript의 그 물렁물렁한 속성들을 많이 가지고 있으며, 타입이 집합으로 인식된다는 게 엄청 다르다. 문서에서 이 부분 위주로 빼오겠다.
TypeScript에서 타입은 공통의 무언가를 공유하는 값의 집합으로 생각하는 것이 좋다.
C#에서는 ‘string’과 ‘int’ 둘 다 가능한 타입이 존재하지 않기 때문에 이 값을 인자로 전달하는 것은 이상하지만, TypeScript에서는 ‘string’ 집합 또는 ‘number’ 집합에 속할 수 있는 값을 전달할 수 있다. 그 값은 단순히 그 집합들의 유니언: ‘string | number’에 속한다. 띠용...
TypeScript에서, 객체는 정확히 단일 타입이 아니며, 인터페이스를 만족하는 객체를 생성할 때, 둘 사이의 선언적인 관계가 없더라도 해당 인터페이스가 예상되는 곳에 해당 객체를 사용할 수 있다고 나와있다.
Pointlike 타입을 인수로 받는 함수와, Named 타입을 인수로 받는 있는 함수가 있다. Pointlike는 x,y 프로퍼티를 가지고, Named는 name 프로퍼티를 가진다. 이때 obj는 x, y, name 프로퍼티를 가진 객체이다. obj가 Pointlike라고, Named라고 선언하는 구문도 없다. 이 경우 함수들이 obj를 인수로 받을 수 있는가? Typescript에서는 된다.
interface Pointlike {
x: number;
y: number;
}
interface Named {
name: string;
}
function printPoint(point: Pointlike) {
console.log("x = " + point.x + ", y = " + point.y);
}
function printName(x: Named) {
console.log("Hello, " + x.name);
}
const obj = {
x: 0,
y: 0,
name: "Origin",
};
printPoint(obj);
printName(obj);
타입 간의 관계는 특정 관계로 선언되었는지가 아닌, 포함된 프로퍼티에 의해 결정된다. 게다가 이렇게 보니 obj는 Pointlike 타입이면서, Named 타입인걸로 보인다.
그래서
class Empty {}
function fn(arg: Empty) {
}
fn({ k: 10 });
이런 식의 호출이 된다. 공집합은 모든 집합의 부분집합이니까...
class Car {
drive() {
// hit the gas
}
}
class Golfer {
drive() {
// hit the ball far
}
}
// No error?
let w: Car = new Golfer();
이것도 에러가 나지 않는다... Golfer의 프로퍼티나 Car의 프로퍼티나 같기 때문이다. 영어에서 공을 세게 쳐서 drive라고 하든 가스를 채워서 drive라고 하든 철자는 같고 프로퍼티가 같으니까 둘을 같은 타입으로 보는 것이다.
이걸 덕타이핑이라고 한다. 오리처럼 굴면 대충 오리로 쳐주기 때문이다. 골프치는 사람이 자동차처럼 굴면 자동차로 쳐주기 때문이다.
문서에 반영 부분이 이해가 안되네. 제가 나약하기 때문이겠죠? 나중에 시간을 들여 읽어보겠습니다.
https://typescript-kr.github.io/pages/tutorials/ts-for-oopers.html
Duck typing ㅋㅋㅋㅋㅋ