2016-09-22 3 views
1

typescript doc 다음 코드에 대해 뭔가 말한다 :타이프 라이터 생성자는

interface ClockConstructor { 
    new (hour: number, minute: number): ClockInterface; 
} 
interface ClockInterface { 
    tick(); 
} 

function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface { 
    return new ctor(hour, minute); 
} 

class DigitalClock implements ClockInterface { 
    constructor(h: number, m: number) { } 
    tick() { 
     console.log("beep beep"); 
    } 
} 
class AnalogClock implements ClockInterface { 
    constructor(h: number, m: number) { } 
    tick() { 
     console.log("tick tock"); 
    } 
} 

let digital = createClock(DigitalClock, 12, 17); 
let analog = createClock(AnalogClock, 7, 32); 

을 ...

createClock의 첫 번째 매개 변수 createClock (AnalogClock, 7, 32, 형 ClockConstructor의 때문에

), AnalogClock에 올바른 생성자 서명이 인지 확인합니다. 당신이 here

이유는 무엇입니까 볼 수 있습니다처럼

그러나, 생성자없이 동일한 코드 를 컴파일 오류가 발생하지 않는 이유는 무엇입니까? 내가 놓친 게 있니?

답변

2

하지 여전히 컴파일 된 JS 하나 만들 것 TS 클래스의 생성자를 갖는

class DigitalClock implements ClockInterface { 
    tick() { 
     console.log("beep beep"); 
    } 
} 

컴파일에 :

var DigitalClock = (function() { 
    function DigitalClock() { 
    } 
    DigitalClock.prototype.tick = function() { 
     console.log("beep beep"); 
    }; 
    return DigitalClock; 
}()); 

그래서 생성자는 인수를받지 않는이 거기를 ,하지만 자바 스크립트에서 인자를 가진 인자를 선언하지 않는 함수를 여전히 호출 할 수 있습니다 :

function fn() { 
    console.log(arguments); 
} 
fn(1, 2, 3); // [1, 2, 3] 

그러나이 경우 타이프 스크립트는 인수로 fn을 호출하는 것에 대해 불평 할 것입니다.
하지만이 확인 될 것입니다 :

type MyFunction = { (a: number, b: number, c: number): void } 

(fn as MyFunction)(1, 2, 3); 

내가 컴파일러 그냥 ctor에 존재하고 실제로 arguments 오브젝트에서 해당 인수를 얻을 수있는 당신이, 당신이 무엇을하는지 아는 당신을 신뢰 추측.

어떻게 이제까지 실패 : 지금 다른 ctor에 서명 거기

class AnalogClock implements ClockInterface { 
    constructor(str: string) {} 
    tick() { 
     console.log("tick tock"); 
    } 
} 
let analog = createClock(AnalogClock, 7, 32); 

때문입니다.