책(200)
-
[any 39] 구체화한 any
1. any 구체화 any는 자바스크립트에서 표현할 수 있는 모든 값을 아우르는 타입이다. 숫자, 문자, 배열, 객체, 정규식, 함수, 클래스, DOM 요소, null, undefined, ... 온갖 것들을 포함하는데, 반대로 말하면 일반적인 상황에선 any를 보다 더 구체적으로 표현할 수 있는 타입이 존재하기도 한다는 뜻이다. 예를들어 배열을 사용한다고 치면, any [ ] 는 any보다 구체적이다. 비슷한 맥락으로 객체를 쓴다고 치면 any보단 { [key :string] :any } 가 더 구체적이다. 38장에서 본 것과 비슷한 맥락인데 아래 함수는 해당 스코프 전반에 걸쳐서 any를 사용하며, any 타입을 반환한다 // function getLength(array: any): any funct..
2022.07.28 -
[any 38] 가능한 좁은 범위에서만 사용
JS → TS로 마이그레이션할 때 코드 일부분에는 타입 체크를 비활성화 시킬 수도 있어야한다. 따라서 any를 절대로 사용하지 말아야 한다기 보단 현명하게 사용하는 방법을 익힐 필요가 있다. 1. any 사용범위 최소화하기 1) 함수에서 any function progressBar(val :Progress) { // 진행도를 그려주는 무언가의 함수 } 얘는 마지막까지 val의 타입이 any라서 이 값을 쓰는 모든 함수에 영향을 미치지만 function 별로() { const val :any = getProgress(); progressBar(val); } 얘는 progressBar함수 하나에서만 any타입이 쓰이니까 다른 코드에는 영향을 미치지 않는다 function 이게낫다() { const val =..
2022.07.28 -
[타입 설계37] 상표 기법(for 공식명칭)
타입스크립트는 구조적 타이핑(덕 타이핑) 때문에 가끔 이상한 결과가 나올 수 있다. 아래 예시는 구조적 타이핑 관점에서야 문제는 없지만 상식적으로 맞지 않는 결과이다. interface Vector2D { x: number; y: number; } function calLength(v :Vector2D) { return Math.sqrt(v.x + v.x + v.y * v.y) } const vec3D = { x: 3, y: 4, z: 5}; // 뭐여 이게 calLength({ x: 3, y: 4 }); // 5 calLength(vec3D); // 5 1. 상표 기법 위 문제를 해결하는 방법 중 하나는 타입의 일부를 '값'처럼 사용하는 것이다. 명시적 태그를 붙이는 것과 유사한 맥락으로, 타입 시스템..
2022.07.27 -
[타입 설계36] 타입 이름은 해당 분야 용어로
컴퓨터 과학에서 어려운 일은 단 두가지 뿐이다. 캐시 무효화와 이름 짓기. - 필 칼튼(Phil Karlton) 타입의 이름 역시 설계에서 매우 중요한 부분이다. 엄선된 타입, 속성, 변수의 이름은 의도를 명확히 하고 코드와 타입의 ㅊ추상화 수준을 높여 준다. 따라서 이름을 붙일 때 아래 세 규칙을 명심하도록 하자. 동일한 의미를 나타낼 때는 같은 용어를 사용하자(글을 쓸 때야 같은 단어를 반복해서 쓰지 말라고하지만 코드작성은 다른 얘기다) data, info, thing, item, obj, entity 같은 모호하고 의미 없는 이름은 피하자 이름을 지을 땐 포함된 내용이나 계산 방식이 아니라 데이터 자체가 무엇을 의미하는지 고려하자. (INodeList보다 Directory가 개념적인 측면에서 훨씬 ..
2022.07.27 -
[타입 설계 34] 부정확한 타입보단 미완성타입
일반적으로 타입이 구체적일수록 버그를 더 많이 잡고 타입스크립트가 제공하는 도구를 활용할 수 있게 된다. 그러나 타입 정밀도를 높이는 과정에서 실수가 발생하기 쉽고 잘못된 타입은 없느니만 못 할 수 있어 주의해야 한다. 1. 부정확한 타입 아래 예시는 지구상의 좌표를 나타내기 위한 인터페이스이며, 타입 정밀도를 높이기 위해 아래와 같은 과정을 거쳤다 coordinates는 위경도를 나타낸다 이를 위해 number [ ]보다 구체적인 [ number, number ]인 튜플타입으로 변경했다 그러나 간과한 것은 좌표 정보엔 고도가 있을 수도 있고, 그 외 다른 정보가 있을 수도 있다는 것 결과적으로 타입 선언을 세밀하게 만드려다가 오히려 타입이 부정확해졌다 interface Point { type: 'Poi..
2022.07.27 -
[4.2] 쿼리 / 쿼리조건(cursor)
1. 커서 쿼리의 결과를 담은 객체를 말한다. db.collection.find 메서드의 반환 결과는 이 커서 객체에 담기게 되는데, 일반적인 언어에서 특정 값을 변수에 담아 자유롭게 사용하듯 몽고 쉘에서도 이 커서를 통해 쿼리 한 결과물을 자유롭게 다룰 수 있다. for ( let i=0; i < 100; i++ ) { db.collection.insertOne({ x : i }); } let cursor = db.collection.find(); { "_id" : ObjectId("62dfc896b445be49b43c2259"), "x" : 0 } { "_id" : ObjectId("62dfc896b445be49b43c225a"), "x" : 1 } { "_id" : ObjectId("62dfc896..
2022.07.26