반응형
any 사용하기
가능한 좁은 범위에서 any 사용하기
function f1(){
const x:any = express();
processBar(x);
}
// 보다는
function f1(){
const x= express();
processBar(x as any);
- 함수의 반환타입은 정의되어야 함수 내부의 any가 밖으로 빠져나가지 않게 할 수 있다.
- 객체 내부의 타입오류는 해당 부분에서만 as any를 사용하여 해결하자!
@ts-ignore
//@ts-ignore를 사용하면 any를 사용하지 않고 해결이 가능함
any를 구체적으로 변형해서 사용하기
any타입을 그대로 정규식이나 함수에 넣는 것은 권장되지 않는다.
function getLength(array:any){}
// ===refactor
function getLength(array:any[]){}
함수 매개변수가 객체이긴 하나 값을 알 수 없다면 {[key:string]:any}처럼 선언하면 된다. → Object로 선언하는 경우, key를 호출 할 수 없다.
함수 안으로 타입 단언문 감추기
⇒ 함수 내부에서는 타입 단언을 사용하고, 함수 외부에 타입정의를 정확히 명시하는 용도로 끝내는 것이 좋다.
any의 진화
any는 타입좁히기와 달리 진화할 수 있음
명시적으로 any를 선언하지 않고, noImplicityAny가 설정된 상태에서 변수의 타입이 암시적 any여야함
모르는 타입에 unknown사용하기
- 어떤 타입이든 unknown에 할당가능하다ㅏ.
- 그러나, unknown은 어떤 타입으로는 할당 불가능하다.
⇒ 사용하려고 하면 즉시 오류를 내기때문에, any보다 낫다.
any는 한번 쓰면 그 영향력이 밖으로 퍼져나가기 때문
{ } 타입 : null 과 undefined를 제외한 모든 값을 포함함
object 타입 : 모든 비기본형 타입으로 이뤄짐
몽키패치보다는 안전한 타입 사용하기
이미 존재하는 객체에 추가 속성을 추가하는경우
- interface의 보강기능 사용
interface Document{ monkey:string; } // 모듈의 관점에서 제대로 동작하기위해서는 global 선언 추가필요함 export {}; declare global{ interface Document{ monkey:string; } } document.Money="Tamarin";
- any 단언문 사용
(document as any).monkey="tamarin";
- 구체적인 타입 단언문
interface MonkeyDocument extends Document{ monkey:string; } (document as MonkeyDocument).monkey='Macaque';
⇒ 그러나 구체적인 타입설계를 통해 해결하는 것이 좋다.
any 추적하기
npx type-coverage
npx type-coverage --detail => 모든 파일을 출력해줌
반응형