any란 Javascript에서 표현할 수 있는 모든 값을 커버하는 큰 범위의 타입이다.
(ex. null, undefined, 숫자, 배열, 객체 etc..)
그렇기 때문에 any를 쓰게된다면 정확한 모델링을 위해 any 자체를 구체적으로 변형해서 사용해야한다.
매개변수가 배열일 경우 타입을 any 대신 any[ ]을 사용하여 정확도를 높일 수 있다.
/**
* 1. 반환 타입이 any로 추론된다.
* 2. 함수 호출 시 매개변수의 타입을 체크하지 않는다.
*/
function getLengthBad(array: any) {
return array.length;
}
/**
* 1. array.length의 타입이 체크되어 반환타입이 any 대신 number로 추론된다.
* 2. 함수 호출 시 매개변수가 배열인 지 체크된다.
*/
function getLength(array: any[]) {
return array.length;
}
// 결과
getLengthBad(/123/) //정규식을 매개변수로 넘겼지만 결과는 오류없이 undefined를 반환
getLength(/123/) // RegExp 형식의 인수는 any[] 에 할당될 수 없다고 오류를 반환
만약 매개변수가 객체일때 타입을 any로 단순하게 표현하는 것이 아닌 아래 방법을 사용할 수 있다.
매개변수가 객체일 때는 아래와 같이 인덱스 시그니처를 이용하여 구체화할 수 있다.
function hasTwelveLetterKey(o: {[key:string]: any}) {
for (const key in o) {
if (key.length === 12) {
return true;
}
}
return false
}
만약 매개변수가 객체지만 들어오는 값을 알 수 없다면 Object 타입을 사용할 수 있다.
하지만 인덱스 시그니처가 없으므로 암시적으로 any 형식이 된다.
function hasTwelveLetterKey(o: object}) {
for (const key in o) {
if (key.length === 12) {
console.log(o[key]) // 인덱스 시그니처가 없으므로 암시적으로 any 형식이 된다.
return true;
}
}
return false
}
함수의 타입을 정의할 때도 any를 구체화해서 사용할 수 있다.
아래와 같이 함수를 일반적인 any 타입으로 정의한 것이 아닌
각 함수들이 호출 시 넘겨받는 매개 변수를 구체화하여 타입의 안정성을 높였다.
type Fn0 = () => any; // 매개변수 없이 호출 가능한 함수
type Fn1 = (arg: any) => any; // 매개변수가 1개 필요한 함수
type FnN = (...arg: any[]) => args.length; // 모든 개수의 매개 변수
any[ ]
, {[key:string]: any}
, {} => any
처럼 구체적인 형태로 사용해야한다.