2016-08-03 2 views
1

TypeScript는 형식을 포함하는 ES6 Javascript의 상위 집합입니다. 클래스는 class 키워드를 사용하여 선언하고 new 키워드를 사용하여 Java에서와 유사하게 인스턴스화 할 수 있습니다.TypeScript에서 "new"키워드없이 클래스를 사용할 수 있습니까?

new 키워드를 사용하지 않고 클래스를 인스턴스화 할 수있는 TypeScript의 유스 케이스가 있는지 궁금합니다.

Bob이라는 클래스가 있다고 가정하면 나는 Bob의 인스턴스가 new Bob()으로 인스턴스화된다고 가정 할 수 있는지 궁금해하기 때문입니다. 기본적으로이에 대한

답변

4

타이프 라이터의 보호, 그래서 당신은이 작업을 수행 할 경우 :

Value of type typeof A is not callable. Did you mean to include 'new'?

는 그러나를 사용하지 않고 만들 수 있습니다 일부 개체가 있습니다 : 당신은 오류가 발생합니다

class A {} 
let a = A(); 

new 키워드는 기본적으로 모든 기본 유형입니다. 당신이 lib.d.ts 보면
당신은 예를 들어, 다른 생성자의 서명을 볼 수

StringConstructor :

interface StringConstructor { 
    new (value?: any): String; 
    (value?: any): string; 
    ... 
} 

ArrayConstructor :

interface ArrayConstructor { 
    new (arrayLength?: number): any[]; 
    new <T>(arrayLength: number): T[]; 
    new <T>(...items: T[]): T[]; 
    (arrayLength?: number): any[]; 
    <T>(arrayLength: number): T[]; 
    <T>(...items: T[]): T[]; 
    ... 
} 

당신이 할 수 new 키워드가 있거나없는 키워드는 항상 같습니다.
원한다면 물론이 동작을 모방 할 수 있습니다.

중요한 점은 typescript가 이러한 문제가 발생하지 않도록 자바 스크립트가 검사하지 않기 때문에 코드를 사용하는 js 코드를 작성하면 new을 사용하는 것을 잊어 버릴 수 있으므로 상황은 여전히 ​​가능합니다.

런타임에 이런 일이 발생했는지 확인한 다음 오류가 발생하면 처리하고 (new을 사용하여 인스턴스를 반환하여 오류를 수정하고 로그에 기록) 매우 쉽게 감지 할 수 있습니다.
는 여기에 대해 이야기 게시물의 : Creating instances without new (일반 JS),하지만 TL; DR은 : 당신은 짧은 대답이 "예"라고 말하는 것 같은

class A { 
    constructor() { 
     if (!(this instanceof A)) { 
      // throw new Error("A was instantiated without using the 'new' keyword"); 
      // console.log("A was instantiated without using the 'new' keyword"); 

      return new A(); 
     } 
    } 
} 

let a1 = new A(); // A {} 
let a2 = (A as any)(); // A {} 

(code in playground)

+2

이 소리 . –

+0

참으로 짧은 대답은 : 예,'new'를 사용하지 않고 ctor를 호출 할 수 있습니다 (그러나 그런 경우에는 인스턴스가 없을 것입니다) –

관련 문제