ts에서 타입 이름을 지을 때는 해당 분야에서 사용되는 용어와 규약을 따르는 것이 좋다. 이를 통해 코드의 가독성과 이해도를 높일 수 있다. 엄선된 타입, 속성, 변수 이름은 의도를 명확히하고 코드와 타입의 추상화 수준을 높여줘야한다. 잘못 선택한 타입 이름은 코드의 이름을 왜곡하고 잘못된 개념을 심어준다.
-> 의미적으로 구분되어야 하는 경우에만 다른 용어를 사용하자.
-> data, info, thing, item, object, entity 같은 모호한 이름은 피해야한다. 만약 그 용어가 해당 분야에서 특별한 의미를 가지면 괜찮지만, 귀찮다고 의미없는 이름을 붙이면 안된다.
-> 예를 들어, INodeList 보다는 Directory가 더 의미있는 이름이다. Directory는 구현 측면이 아니라 개념적인 측면에서 디렉터리를 생각하게 한다. 좋은 이믈은 추상화 수준을 높이고 의도치 않은 충돌의 위험성을 줄인다.
가독성을 높이고 추상화 수준을 올리기 위해 해당 분야의 용어를 사용해야 한다.
같은 의미에 다른 이름을 붙이면 안된다.
구조적 타이핑에 의해서 가끔은 원치 않은 결과가 나오거나 코드가 실행될 수 있다.
따라서 공식 명칭에는 상표를 붙여야한다.
->덕 타이핑 을 사용하기에 값을 세밀하게 구분하지 못하는데 이부분을 해결하기 위해
(구조적 타이핑이란 타입의 일부분만 일치하면 통과하는 것을 의미한다. )
interface Vector2D {
x: number;
y: number;
}
function calculateNorm(p: Vector2D) {
return math.sqrt(p.x * p.x + p.y * p.y);
}
calculateNorm({ x: 3, y: 4 }); // 정상, 5
const vec3D = { x: 3, y: 4, z: 1 };
calculateNorm(vec3D); // 정상, 5
위 코드는 구조적 타이핑 관점에서는 문제가 없지만 수학적으로 따지면 2차원 벡터를 사용해야 이치에 맞는다. 3차원 벡터를 허용하지 않게 하려면 공식 명칭을 사용하면 된다.
이러한 경우 ‘상표(_brand)’를 이용한다. 이 기법은 타입 시스템에서만 동작하여 런타임 오버헤드를 줄이는 효과가 있다.
nterface Vector2D {
_brand: "2d";
x: number;
y: number;
}
function vec2D(x: number, y: number): Vector2D {
return { x, y, _brand: "2d" };
}
function calculateNorm(p: Vector2D) {
return math.sqrt(p.x * p.x + p.y * p.y);
}
calculateNorm(vec2D(3, 4)); // 정상, 5
const vec3D = { x: 3, y: 4, z: 1 };
calculateNorm(vec3D); // x '_brand'속성이 ... 형식에 없음
구조적 타이핑(덕 타이핑) 때문에 값을 세밀하게 구분하지 못하는 경우가 있다.
상표 기법은 타입 시스템에서 동작하지만 런타임에 상표를 검사하는 것과 동일한 효과를 얻을 수 있다.