타이프 라이터의 보호, 그래서 당신은이 작업을 수행 할 경우 :
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)
이 소리 . –
참으로 짧은 대답은 : 예,'new'를 사용하지 않고 ctor를 호출 할 수 있습니다 (그러나 그런 경우에는 인스턴스가 없을 것입니다) –