ZeroCho / ts-book

타입스크립트 교과서 소스 코드
36 stars 5 forks source link

[p.184, 질문] 선언 병합을 활용했을 때 좋은 경우에 관한 질문 #61

Closed JaeHye0k closed 5 hours ago

JaeHye0k commented 8 hours ago
declare class A {
    constructor(name: string)
}
function A(name: string){
    return new A(name);
}

new A('zerocho');
A('zerocho');

위 코드는 책에 나와있는 예시 코드입니다. 위와 같이 코드를 작성하면 클래스가 있을 때 new 키워드를 붙이지 않아도 되게 한다고 나와있습니다. 하지만 TypeScript playground 에서 실행 시 해당 코드가 다음과 같은 자바스크립트 코드로 변환되어 Maximum call stack size exceeded 에러가 발생합니다.

"use strict";
function A(name) {
    return new A(name);
}
new A('zerocho');
A('zerocho');

실제로 사용하려면 어떻게 사용해야되는지 알려주실 수 있나요?

ZeroCho commented 7 hours ago

타입 에러 없이 실제 실행까지 되는 코드는 다음과 같습니다.

declare class A {
    name: string;
    constructor(name: string)
}
function A(this: A | void, name: string){
    if (new.target && this) {
        this.name = name;
        return this;
    } else {
        return { name };
    }
}

new A('zerocho');
A('zerocho');
JaeHye0k commented 5 hours ago

답변 감사합니다! 덕분에 new.target 이라는 속성도 알아가네요!