tsconfig.json
을 사용하는 것이 좋습니다.noImplicitAny
를 설정하는 것이 좋습니다.undefined
는 객체가 아닙니다” 같은 런타임 오류를 방지하기 위해 strictNullChecks
를 설정하는 것이 좋습니다.interface Vector2D {
x: number;
y: number;
}
function calculateLength(v: Vector2D) {
return Math.sqrt(v.x * v.x + v.y * v.y);
}
interface NamedVector {
name: string;
x: number;
y: number;
}
const v: NamedVector = { x: 3, y: 4, name: 'Zee' };
calculateLength(v);
// 타입스크립트 타입 시스템은 자바스크립트의 런타임 동작을 모델링
// NamedVector의 구조가 Vector2D와 호환되기 때문에 calculateLength 호출이 가능
interface Venctor3D {
x: number;
y: number;
z: number;
}
function normalize(v: Vector3D) {
const length = calculateLength(v);
return {
x: v.x / length,
y: v.y / length,
z: v.z / length,
};
}
normalize({ x: 3, y: 4, z: 5 });
// { x: 0.6, y: 0.8, z:1 };
// Vector3D와 호환되는 {x, y, z} 객체로 calculateLength를 호출하면, 구조적 타이핑 관점에서
// x와 y가 있어서 Vector2D와 호환됩니다. 따라서 오류가 발생하지 발생하지 않았습니다.
// 함수를 작성할 때, 호출에 사용되는 매개변수의 속성들이 매개변수 타입에 선언된 속성만을 가질거라 생각하기 쉬움
// 이러한 타입은 봉인된(sealed) 또는 정확한(precise) 타입이라 불리우는데 타입스크립트는 아님
// 좋든 싫든 열려(open) 있음
any 타입에는 타입 안정성이 없습니다.
any는 함수 시그니처를 무시해 버립니다.
any 타입에는 언어 서비스가 적용되지 않습니다.
any타입은 코드 리팩터링 때 버그를 감춥니다.
any는 타입 설계를 감춰버립니다.
any는 타입시스템의 신뢰도를 떨어뜨립니다.
any 타입을 사용하면 타입 체커와 타입스크립트 언어 서비스를 무력화시켜 버립니다. any 타입은 진짜 문제점을 감추며, 개발 경험을 나쁘게 하고, 타입 시스템으 신뢰도를 떨어뜨립니다. 최대한 사용을 피하도록 합시다.
출처 이펙티브 타입스크립트