분류 전체보기 (155) 썸네일형 리스트형 Effective Typescript - 38 - any 타입은 가능한 좁은 범위에서만 사용하기 아래 예제는 함수 호출 시 any로 강제로 변환해야 하는 경우, any를 가능한 좁은 범위 내에서 사용하기 위한 방법을 설명한다. interface Foo { _brand: 'foo' } interface Bar { _brand: 'bar' } function processBar(b: Bar){ console.log(b); } function expressionReturningFoo(): Foo { /** */ return {_brand: 'foo'}; } function f1(){ const x: any = expressionReturningFoo(); // 비추 processBar(x) } function f2(){ const x = expressionReturningFoo(); processBar(.. Effective Typescript - 37 - 공식 명칭(nominal typing)에는 상표를 붙이기 구조적 타이핑의 특성 때문에 가끔 코드가 의도하지 않은 결과를 낼 수 있습니다. 아래의 예제가 바로 그러한 상황을 표현하고 있습니다. interface Vector2D { x: number; y: number; }; function clacNorm(p: Vector2D){ return Math.sqrt(p.x * p.x + p.y * p.y); } clacNorm({x: 3, y: 4}); // 정상 결과 5 const vec3D = {x : 3, y: 4, z: 1}; clacNorm(vec3D); // 정상 결과 5 // 구조적 타이핑 관점에서는 이상이 없는 것이지만 수학적 결과를 기대했다면 오류이다. clacNorm 함수가 3차원 벡터를 허용하지 않게 하려면 공식 명칭(nominal typing)을.. Effective Typescript - 36 - 해당 분야의 용어로 타입 이름 짓기 * 가독성을 높이고, 추상화 수준을 높히기 위해서 해당 분야의 용어를 사용해서 타입 이름을 지정해야한다. * 같은 의미에 다른 이름을 붙이면 안된다. 특별한 의미가 있을 때만 용어를 구분해야 한다. Effective Typescript - 35 - 데이터가 아닌, API와 명세를 보고 타입 만들기 * 코드의 세밀한 부분 까지 타입 안정성을 얻기 위해 API 또는 데이터 형식에 대한 타입 생성을 고려해야한다. * 데이터에 드러나지 않는 예외적인 경우들이 문제가 될 수 있으니 데이터를 보고 타입 생성하기 보다는 명세나 API를 참고하여 타입 설계를 하는 것이 좋다. Effective Typescript - 34 - 부정확한 타입보다는 미완성 타입을 사용하기 타입 선언을 작성하다 보면 코드의 동작을 좀 더 구체적으로 또는 덜 구체적으로 모델링하게 되는 상황을 맞닥뜨리게 됩니다. 일반적으로 타입이 구체적일수록 버그를 더 많이 잡아내고 타입스크립드 언어 지원을 더욱 많이 받습니다. 하지만, 타입을 정말하게 하는 과정은 신중해야 합니다. 타입을 정밀하게 하는 작업 자체가 올바르지 않으면 타입이 없는 것 보다 못한 결과를 불러오기 때문입니다. * 타입을 정확하게 모델링 하지 못하면, 부정확하게 모델링 하지 말아야함. * any와 unknown을 구별할 줄 알아야함. Effective Typescript - 33 - string 타입보다 더 구체적인 타입 사용하기 string 타입은 매우 넓은 범위를 가집니다. 따라서 string 타입으로 변수를 선언하려 한다면, 좀 더 구체적이고 좁은 타입이 더 적절하지 않은지 고민이 필요합니다. // 비추 interface Album { artist: string; title: string; release: string; //YYYY-MM-DD recordingType: string; // 예를 들어 "live" "studio" } // 추천 type RecordingType = "studio" | "live" // interface AlbumFix { artist: string; title: string; release: Date; recordingType : RecordingType } 위와 같이 추천 방식을 이용해 타입의.. Effective Typescript - 32 - 유니온의 인터페이스보다는 인터페이스의 유니온을 사용하기 유니온 타입의 속성을 가지는 인터페이스를 작성 중입니까? 그렇다면, 인터페이스의 유니온 타입을 사용하는 것이 더 낫지 않은지 검토가 필요합니다. 벡터를 그리는 프로그램을 작성 중이고, 특정한 기하학적 타입을 가지는 계층의 인터페이스를 정의한다고 가정해 보고 어떤 방식으로 인터페이스를 설계하는 것이 유리한지 고민해봅시다. // 비추 - 비정상적이 조합의 값이 허용되는 구조 interface Layer { layout: FillLayout | LineLayout | PointLayout; point: FillPaint | LinePaint | PointPatin; } // 추천 interface FillLayer { layout : FillLayout; paint: FillPaint; } interface .. Effective Typescript - 31 - 타입 주변에 null 값 배치하기 strictNullChecks 설정을 활성화 시키면 오류를 회피하기위해 null check하는 예외 처리 구문이 코드 전반에 추가 되어야 한다고 생각 할 수 있다. 그러나, 값이 전부 null이거나 전부 null이 아닌 경우로 분명하게 구별될 수만 있다면 코드 작성이 훨씬 쉬워진다고 한다. 이와 관련하여 타입에 null을 추가하는 방식을 사용했을 때 어떻게 편리해 지는지 알아보도록 하자. 다음은 숫자들의 최소값과 최대값을 게산하는 extent 함수 예제이다. // 이 함수의 문제 // nums가 깡통 배열이면 [undefined, undefined] 배열이 반환된다. 객체에 undefined 가 포함되는 것을 최대한 기피하는 것이좋다고 한다. // 배열에 0이 들어 잇으면 의도하지 않게 앞쪽 if(!mi.. 이전 1 2 3 4 5 6 7 8 ··· 20 다음