2017-09-20 47 views
0

編輯 - 更新代碼來反映意見TS2417重寫時,靜態方法

我升級從TS 2.2.1一些舊代碼,TS 2.5.2,並創下了彙編問題。 當試圖編譯下面的代碼:

export interface IFuture<TResult> { 
    done(callback: (result: TResult) => void): IFuture<TResult>; 
} 
export interface IVoidFuture extends IFuture<void | any> { 
    done(callback: (result?: void) => void): IVoidFuture; 
} 

export class Future<TResult> implements IFuture<TResult>{ 
    public static createResolved<TResult>(result?: TResult): IFuture<TResult> { 
     let asyncResult: Future<TResult> = new Future<TResult>(); 
     return asyncResult; 
    } 


    public done(callback: (result: TResult) => void): Future<TResult> { 
     return this; 
    } 
} 

export class VoidFuture extends Future<void> implements IVoidFuture { 
    private static _resolvedFuture: IVoidFuture; 

    public static createResolved(result?: void): IFuture<void> { 
     if (!VoidFuture._resolvedFuture) { 
      VoidFuture._resolvedFuture = Future.createResolved<void>(); 
     } 
     return VoidFuture._resolvedFuture; 
    } 

    public done(callback: (result?: void) => void): IVoidFuture { 
     return super.done(callback); 
    } 
} 

我得到以下錯誤:

file.ts(20,14): error TS2417: Class static side 'typeof VoidFuture' incorrectly extends base class static side 'typeof Future'. 
    Types of property 'createResolved' are incompatible. 
    Type '(result?: void) => IVoidFuture' is not assignable to type '<TResult>(result?: TResult) => IFuture<TResult>'. 
     Types of parameters 'result' and 'result' are incompatible. 
     Type 'TResult' is not assignable to type 'void'. 
+0

器具使用接口時是關鍵。擴展是爲了繼承,儘管這不是現在的問題。 – rjustin

回答

0

,因爲它是書面的VoidFuture類應實現的接口。未來與預期的未來不符。也許你想要未來?

export interface IFuture<TResult> { 
 
    done(callback: (result: TResult) => void): IFuture<TResult>; 
 
} 
 
export interface IVoidFuture extends IFuture<void | any> { 
 
    done(callback: (result?: void) => void): IVoidFuture; 
 
} 
 

 
export class Future<TResult> { 
 
    public static createResolved<TResult>(result?: TResult): IFuture<TResult> { 
 
     let asyncResult: Future<TResult> = new Future<TResult>(); 
 
     return asyncResult; 
 
    } 
 
    public done(callback: (result: TResult) => void): Future<TResult> { 
 
     return this; 
 
    } 
 
} 
 
export class VoidFuture implements Future<TResult> {//needs to match interface definition 
 
    private static _resolvedFuture: IVoidFuture; 
 
    public static createResolved(result?: void): IVoidFuture { 
 
     if (!VoidFuture._resolvedFuture) { 
 
      VoidFuture._resolvedFuture = Future.createResolved<void>(); 
 
     } 
 
     return VoidFuture._resolvedFuture; 
 
    } 
 

 
    public done(callback: (result?: void) => void): IVoidFuture { 
 
     return super.done(callback); 
 
    } 
 
}