본문 바로가기

javascript/typescript

(13)
[typescript] generic + constructor 타입에서 생성자 파라미터 타입 추론 결론 생성자에 대한 타입을 지정할 때 반환 값 T만 지정하는 대신, 파라미터 P에 대한 정보도 함께 지정하면 ConstructorParameters을 통해 제네릭 타입의 생성자 파라미터를 추론할 수 있다. IConstructor = new (...args: any) => T 정의는 생성자 파라미터가 any로 고정되어 있어 추론이 발생하지 않으나, args의 타입도 추론하도록 제네릭 타입 매개변수 P로 분리해두면 ConstructorParameters가 이를 추론한다. // 생성자 파라미터도 인식하는 클래스 생성자 타입 정의 export type IConstructor = new (...args: P) => T; // 테스트 클래스 export class Bullet extends GameObject { ..
[typescript] ts2345 클라우드 강의 마지막 발표를 위해 기존에 aws 기반으로 구성한 뉴스 댓글 수집 파이프라인을 azure 기반으로 마이그레이션 하고 있다. 이 과정에서 뉴스 데이터를 수집할 때 타입 선언으로 정의한 내용이 있어 인터페이스로 변경해보았는데, 다음과 같은 에러가 발생했다. // 인터페이스로 변경한 타입 interface NLListOptions { query: string; ds: string; de: string; news_office_checked?: string; office_type?: string; mynews?: string; }; // 해당 객체를 이용하는 함수 export async function getNewsLinkList( variable_options: NLListOptions, dela..
[typescript] Type vs Interface 면접에서 이 타입과 인터페이스를 사용한 이유에 대한 질문이 나왔다. 둘 사이의 차이를 깊게 생각해 본 적이 없어서, 이 부분을 이상하게 대답했던 점이 참 아쉽게 느껴진다. type은 몰라도 interface에 대해서는 선언 병합이라는 명확한 이점이 있는데, 이게 왜 문을 나온 후에 기억나는 걸까? 정말 너무 아쉽다. 이러한 배경에서 type과 interface의 차이에 대해 정리해보기로 한다. type alias https://www.typescriptlang.org/ko/docs/handbook/2/everyday-types.html#%ED%83%80%EC%9E%85-%EB%B3%84%EC%B9%AD 우리는 쉽게 type이라고 칭하지만, 공식 문서에서는 type alias라고 명시되어 있다. 타입 별칭..
[typescript] structural typing https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html#structural-type-system https://eclipse.dev/n4js/features/nominal-and-structural-typing.html nominal typing 타입의 이름을 기준으로 타입을 구분하는 방식. 두 유형의 이름이 동일하면 동일한 것으로 간주하며, 타입 T1이 T2의 서브타입으로 간주되기 위해서는 반드시 extends와 같은 구문을 이용하여 명시적으로 서브타입임을 선언해야 한다. 위 특성에 의해 nominal typing을 채택하는 언어에서는 내부 속성 및 메서드를 동일하게 가지고 있더라도 클래스의 이름이 다르면 다른 것으로 간주되며..
[nodejs] nodemon + ts-node을 es module 환경에서 사용하기 https://nodemon.io/ https://github.com/TypeStrong/ts-node nodemon은 프로젝트 내에서 지정된 파일을 감시하여 변경이 발생하는 경우 앱을 재시작하는 기능을 가진 패키지로, 개발 환경에서 코드가 변경될 때마다 수동으로 앱을 재시작해야 하는 부담을 덜어준다. ts-node는 내부적으로 타입스크립트 컴파일러를 이용하여 생성된 자바스크립트 파일을 실행해주는 패키지이다. 이러한 동작은 어디까지나 "내부적"으로 처리되기 때문에 개발 환경에서는 자바스크립트 파일이 생성되지 않는다. tsconfig.json 파일 내에 outDir을 따로 지정해두지 않으면 타입스크립트 파일이 있는 위치에 컴파일되어 코드가 상당히 난잡하게 섞이는데, ts-node을 이용하면 이런 지저분한 ..
[typescript] 오버로딩 요점 타입스크립트에는 C++, Java 등 정적 타입 언어에 대응되는 함수 본문에 대한 오버로딩은 존재하지 않는다. 대신 함수에 대한 오버로드 시그니처(콜 시그니처)를 기반으로 오버로딩인 것 "처럼" 만들 수는 있다. 메서드 오버로딩 오버로딩은 이름은 같지만 입력 파라미터 타입 + 출력 형식이 다른 여러 개의 메서드를 중복 정의하는 것을 의미한다. 오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다. 메서드의 이름이 같아야 한다. 애초에 이름이 같지 않으면 오버로딩이 아니다. 메서드의 입력 파라미터의 타입 또는 형식이 반드시 달라야 한다. 출력 형식은 같든 다르든 입력 파라미터 형식만 다르다면 상관없다. 예를 들어, 아래 코드는 오버로딩에 해당한다. int add(int a, int b) { ..
[타입스크립트] sequelize: Optional 인터페이스 Documentation - Utility Types Types which are globally included in TypeScript www.typescriptlang.org 타입스크립트에서는 일반적인 타입 변환을 용이하게 하려는 목적으로 여러가지 유틸리티 타입을 제공한다. 그러나 아쉽게도 해당 유틸리티 타입 중에서 객체 혹은 클래스 내의 "특정" 프로퍼티만을 optional 하게 만드는 유틸리티 타입은 존재하지 않는다. 이때 sequelize 라이브러리를 타입스크립트에 적용시키기 위해 여러 문서를 찾아보던 도중, 해당 라이브러리 내에 특정 프로퍼티만을 optional하게 만들어주는 Optional 인터페이스가 존재해, 이에 대해 살펴보았다. 상황 가정 : Product에 대한 인터페이스를 생성 회..
[타입스크립트] 함수 오버로딩 타입스크립트는 정적 타이핑을 사용할 수 있다. 이때 자바, C++, C# 등 정적 타이핑을 사용하는 다양한 언어들에서는 함수 오버로딩 기법을 지원하고 있는데, 타입스크립트 역시 명색이 정적 타이핑 언어이므로 이것이 가능하다. 문제는 타입스크립트가 자바스크립트로부터 완전히 독립된 형태로 동작하지 않는다는 점이다. 타입스크립트는 자바스크립트에 문법이나 특정 기능을 추가하여 에디터 수준에서 동적 타이핑을 지원하기는 하지만, 실제 프로그램으로 동작할 때는 자바스크립트 코드로 치환된다. 따라서 비록 타입스크립트 문법을 이용하여 코드를 작성하더라도 해당 코드가 자바스크립트의 규칙을 깨서는 안된다. 적어도 이 특징은 타입스크립트가 자바스크립트로 치환되지 않고도 사용 환경에서 사용될 수 있는 기술이 등장하지 않는 한 ..