Book

    9. any 다루기(2/2) | 이펙티브 타입스크립트 5장

    9. any 다루기(2/2) | 이펙티브 타입스크립트 5장

    42. 모르는 타입의 값에는 any 대신 unknown을 사용하기 1. 함수의 반환값과 관련된 unknown 함수의 반환 타입으로 any를 사용하는 것은 좋지 않은 설계다. function parseYAML(yaml: string): any {} interface Book { name: string; author: string; } const book = parseYAML( `name: Jane Eyre author: CharlotteBronte` ); console.log(book.title); // 오류 없음. 런타임에 "undefined" 경고 book("read"); // 오류 없음. 런타임에 타입 에러 발생 대신 함수가 unknown 타입을 반환하게 만드는 것이 더 안전하다. function s..

    4. 코드로 보는 객체의 협력 관계 | 객체지향의 사실과 오해 4장

    4. 코드로 보는 객체의 협력 관계 | 객체지향의 사실과 오해 4장

    최후통첩 게임은 인간을 바라보는 두 가지 관점의 충돌을 잘 설명한다. 인간이 가지고 있는 본연의 특성이라는 관점에서 인간은 이기적으로 합리적인 존재다. 그러나 타인과 관계를 맺는 과정 속에서 인간은 본연의 특성을 배제하고 자신의 이익을 최소화하는 불합리한 선택을 하게 된다. 결론적으로 인간이 어떤 본질적인 특성을 지니고 있느냐가 아니라 어떤 상황에 처해 있느냐가 인간의 행동을 결정한다. 즉, 각 개인이 처해 있는 정황 또는 문맥이 인간의 행동 방식을 결정한다. 객체의 세계에서도 협렵이라는 컨텍스트가 객체의 행동 방식을 결정한다. 객별적인 객체의 행동이나 상태가 아니라 객체들 간의 협력에 집중하자. 1. 협력 협력의 본질은 요청과 응답으로 연결되는 네트워크다. 협력은 한 객체가 다른 객체에게 도움을 요청할..

    8. any 다루기(1/2) | 이펙티브 타입스크립트 5장

    8. any 다루기(1/2) | 이펙티브 타입스크립트 5장

    38. any 타입은 가능한 한 좁은 범위에서만 사용하기 function processBar(b: Bar) {} function expressionReturningFoo(): Foo {} function f() { const x = expressionReturningFoo(); processBar(x); // 'Foo' 형식의 인수는 'Bar' 형식의 매개변수에 할당될 수 없습니다. } x가 foo 타입과 Bar 타입에 동시에 할당 가능하다면, 오류를 제거하는 방법은 두 가지다. function f1() { const x: any = expressionReturningFoo(); // 나쁜 방법 processBar(x); } function g() { const foo = f1(); // 타입이 any ..

    7. 타입 설계(2/2) | 이펙티브 타입스크립트 4장

    7. 타입 설계(2/2) | 이펙티브 타입스크립트 4장

    33. string 타입보다 더 구체적인 타입 사용하기 문자열을 남발하여 선언된(stringly typed) 코드를 비하자. 모든 문자열을 할당할 수 있는 string보다 더 구체적인 타입을 사용하자. // 좋지 않은 예 interface Album { artist: string; title: string; releaseDate: string; recordingType: string; } // 개선한 코드 type RecordingType = "studio" | "live"; interface Album { artist: string; title: string; releaseDate: Date; recordingType: RecordingType; } 장점 1. 타입을 명시적으로 정의함으로써 다른 곳으로..

    6. 타입 설계(1/2) | 이펙티브 타입스크립트 4장

    6. 타입 설계(1/2) | 이펙티브 타입스크립트 4장

    28. 유효한 상태만 표현하는 타입을 지향하기 유효한 상태와 무효한 상태를 둘 다 표현하는 타입은 혼란을 초래하기 쉽고 오류를 유발하게 된다. interface State { pageText: string; isLoading: boolean; error?: string; } function renderPage(state: State) { if (state.error) { return "Error"; } else if (state.isLoading) { return "Loading"; } return "page"; } async function changePage(state: State, newPage: string) { state.isLoading = true; try { const response = ..

    3. 객체라는 추상화, 타입은 추상화 도구 | 객체지향의 사실과 오해 3장

    3. 객체라는 추상화, 타입은 추상화 도구 | 객체지향의 사실과 오해 3장

    추상화는 불필요한 부분을 무시함으로써 단순하게 만드는 것이다. 객체지향에서는 객체라는 추상화를 통해 복잡성을 극복한다. 객체들을 분류하는 것 또한 추상화다. 이 때 분류 장치가 되는 것이 개념(컨셉)이다. 타입은 개념이다. 불필요한 요소를 배제하여 정적인 모델을 다룰 수 있게 하는 추상화 도구다. 객체를 분류하는 기준은 타입(즉, 개념)이며, 이 타입을 나누는 기준은 객체의 행동이다. 타입을 구현하는 한 가지 대표적인 방법이 클래스다. (타입 != 클래스) 추상화를 통한 복잡성 극복 우리는 지하철을 편리하게 이용할 수 있다. 바로 단순하고 직관적인 지하철 노선도가 있기 때문이다. 우리는 지하철 노선도를 볼 때 사실적인 지형을 보진 않는다. 출발점과 환승점, 그리고 그 연결을 본다. 해리 벡은 이러한 목적..

    5. 타입 추론(2/2) | 이펙티브 타입스크립트 3장

    5. 타입 추론(2/2) | 이펙티브 타입스크립트 3장

    24. 일관성 있는 별칭 사용하기 별칭은 타입스크립트가 타입을 좁히는 것을 방해한다. 따라서 별칭은 일관되게 사용해야 한다. 별칭을 남발하면 제어 흐름을 분석하기 어렵다. interface Coordinate { x: number; y: number; } interface BoundingBox { x: [number, number]; y: [number, number]; } interface Polygon { exterior: Coordinate[]; holes: Coordinate[]; bbox?: BoundingBox; } function isPointInpolygon(polygon: Polygon) { const box = polygon.bbox; if (polygon.bbox) { polygon...

    4. 타입 추론(1/2) | 이펙티브 타입스크립트 3장

    4. 타입 추론(1/2) | 이펙티브 타입스크립트 3장

    타입스크립트는 타입 추론을 적극적으로 수행한다. 숙련된 타입스크립트 개발자는 비교적 적은 수의 구문을 사용한다. 19. 추론 가능한 타입을 사용해 장황한 코드 방지하기 타입스크립트가 타입을 추론할 수 있다면 타입 구문을 작성하지 않는 게 좋다. 오히려 방해가 될 뿐이다. // 비생산적이며 형편없는 스타일 let x: number = 12; let x = 12; // 로 충분하다. 타입스크립트는 예상보다 더 정확하게 추론하기도 한다. const axis1: string = 'x'; // 타입은 string const axis2 = 'y'; // 타입은 "y" 불필요한 명시적 타입 구문은 리팩터링을 더 번거롭게 한다. 비구조화 할당문은 모든 지역 변수의 타입이 추론되도록 하기 때문에 명시적 타입 구문을 넣는..