2016-09-22 12 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

を見ることができるようにしかし、ない同じコードコンストラクタをコンパイルし、エラーをスローしませんか?私は何か不足していますか? TSクラスのコンストラクタは、まだコンパイルJSに1を作成します持っていない

答えて

2

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

コンパイルはへ:

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

だから、任意の引数を受け取りませんが、コンストラクタがありますしかし、javascriptでは、引き数を引数として宣言しない関数を呼び出すことができます。

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

この場合、typescriptは引数のあるfnを呼び出すことについて不平を言うでしょう。
しかし、これはOKになります:私は、ctorのが存在し、あなたが実際にargumentsオブジェクトからそれらの引数を得ることができるよう、コンパイラはちょうど、あなたが何をしているか知っていることを信頼していること

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

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

思います。

この方法を、これまで失敗します:

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

を今すぐ異なるCTORの署名がありますので。