const names = ['Alice', 'Bob'];
console.log(names[2].toUpperCase());
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); // 정상. 5
NamedVector의 구조가 Vector2D와 호환되기 때문에 calculateLength 호출이 가능하다.
interface Vector3D {
x: number;
y: number;
z: number;
}
function normalize(v: Vector3D){
const length = calculateLength(v); // Vector2D 가 아닌 Vector3D 타입을 넣어도 오류가 나지 않는다.
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 }
calculateLength 가 2D 벡터를 받도록 선언했지만 3D 벡터를 받는데 문제가 없었다.
Vector3D 구조가 Vector2D 와 호환되기 때문이다.
함수에서 매개변수의 속성들이 매개변수 타입에 선언된 속성만 가지는 경우를 봉인된(sealed), 정확한(precise) 타입이라고 부른다. 열린 타입은 이와 반대이다.
즉 타입에 선언된 속성 외의 다른 속성들을 가지더라도 두 타입은 서로 호환된다.
let age: number;
age = '12';
// ~~~ Type '"12"' is not assignable to type 'number'
age = '12' as any; // OK
age += 1; // OK; at runtime, age is now "121"
원래 number타입을 any타입으로 바꾸었기 때문에 age는 '12'를 할당받아, string타입으로 바뀌어 age에 1을 더할 때 '121'이 된다!
function calculateAge(birthDate: Date): number {
// COMPRESS
return 0;
// END
}
let birthDate: any = '1990-01-19';
calculateAge(birthDate); // OK
이 함수의 시그니처는 매개변수가 Date 타입이어야 한다는 것이다. 하지만 위 코드에서는 any 타입을 사용하여 이 시그니처를 무시한 것이다.
자동완성 기능과 적절한 도움말이 제공되지 않는다.
타입 체커를 통과함에도 런타임에 오류가 발생할 수 있게된다.
타입 설계를 감춘다.
타입 시스템의 신뢰도를 떨어뜨린다.
any 타입으로 인해 런타임에 타입 오류가 발생될 수 있고 이는 신뢰할 수 없는 코드이다.