공변성(Covariance)A가 B의 서브타입일 때, T는 T이면 타입 T는 공변이다.반환 타입이 공변적이라는 것은 반환 타입이 서브타입 관계를 유지하는 것을 말합니다.아래 예제에서 Cat은 Animal의 서브 타입니다. 그리고 Cat[]역시 Animal[]의 서브타입입니다. 서브 타입의 관계가 배열에서도 똑같이 유지됐음으로 공변적이라 할 수 있습니다. type IsSubtypeOf = S extends P ? true : falseclass Animal { name: string constructor(name: string) { this.name = name }}class Cat extends Animal { meow() { console.log('Meow') }}const cat ..
서론이 글은 any-considered-harmful을 번역, 정리한 글임을 밝힙니다. any를 사용하는 것은 대부분의 경우, 오용하기 쉬운 코드를 만들어 냅니다.예를 들어 아래와 같은 myFunction은 런타임 에러를 발생시킵니다.const myFunction = (input: any) => { input.someMethod();};myFunction("abc"); // This will fail at runtime!하지만 모든 케이스에서 any를 사용하면 안 되는 것은 아닙니다. 이번 글에서는 any의 사용이 유용한 경우에 대해서 알아보도록 하겠습니다.매개변수 제약 조건함수의 매개변수를 추론하는 ReturnType을 정의한다고 가정해 보겠습니다.any를 사용하지 않는다면 args의 타입은 unkn..
서론이 글은 naverD2의 아티클을 재구성한 글임을 밝힙니다.다중 중첩된 객체를 평탄화하는 유틸함수 flattenObject가 있습니다.아래 코드에서 아쉬운 점은 반환 타입이 any로 정의되어 있다는 점인데요. 오늘 포스팅의 내용은 이 flattenObject의 반환 타입을 추론하는 과정에 대한 설명입니다. 원문에서는 문제 해결의 관점에서 상향식으로 서술되어있지만 이 글에서는 기존 프로젝트에 작성된 복잡한 타입 정의를 분석하는 상황을 가정하고 하향식으로 설명해보도록 하겠습니다.function flattenObject(obj:any, result: any = {}):any { for (const key in obj) { if(typeof obj[key] === 'object' && obj[key] &&..
1. Type assertion 대신 Type Guard로 타입 좁히기as(type assertion)대신 type guard를 사용하는 것이 대부분 더 안전합니다.as(type assertion)의 경우 type 체크의 블랙박스를 만들고 운영 이슈로 이어질 수 있습니다.const dog = {} as Dog;// ❌ 런타임 에러가 나기 쉽다.dog.bark();interface Animal { type: 'dog' | 'bird'}type AnimalType = Animal['type']interface Dog extends Animal { type: 'dog'; bark: VoidFunction}interface Bird extends Animal { type: 'bird'; ..