2016-09-27 91 views
1

我想寫一個方法總是返回它被調用的類型。我發現了「this」類型,它允許類似的東西,但它似乎只與字面「this」兼容,而不與同一類的其他實例兼容。總是返回自己的類型/「類型X不能分配鍵入此類型的打字稿方法」

abstract class A { 
    // I need a method which always returns the same type for a transformation method, 
    // a clone function would need the same interface 
    abstract alwaysReturnSameType(): this 
} 
class B extends A { 
    x:number 
    constructor(x:number) { 
     this.x = x 
    } 
    alwaysReturnSameType():this { 
     return new B(this.x + 1) // ERROR: Type 'B' is not assignable to type 'this'. 
     // this works, but isn't what I need: return this 
    } 
} 

我已經看了一些很長的問題,在github上(例如https://github.com/Microsoft/TypeScript/issues/5863),但我不知道是否有要在那裏找到一個解決方案。

有沒有解決這個方式或者我應該投給剿錯誤,即return <this> new B()

+0

我不認爲你可以使用關鍵字** this **作爲類型。 – toskv

+3

@toskv請參閱https://www.typescriptlang.org/docs/handbook/advanced-types.html「多態此類型」 –

回答

1

你可以將它轉換爲this

class B extends A { 
    x: number; 

    constructor(x: number) { 
     super(); 
     this.x = x 
    } 

    alwaysReturnSameType(): this { 
     return new B(this.x + 1) as this; 
    } 
} 

code in playground

我米不知道爲什麼它沒有它的工作。


它實際上是有道理的,它抱怨返回new B
當您聲明您返回this它表示「當前實例」,但新實例不同。

1

您的代碼不會編譯,因爲它不能在其他類的存在下工作(不能證明它不存在)。

class B extends A { 
    x:number 
    constructor(x:number) { 
     this.x = x 
    } 
    alwaysReturnSameType():this { 
     return new B(this.x + 1) // ERROR: Type 'B' is not assignable to type 'this'. 
     // this works, but isn't what I need: return this 
    } 
} 

class C extends B { 
    constructor() { super(3); } 
    foo() { } 
} 

let x = new C(); 
let y = x.alwaysReturnSameType(); // y: C, but it's a B 
y.foo(); // fails 

如果你想返回this你需要return this;,或者做更復雜的東西弄清楚如何動態地從類實例決定自己的構造函數,並正確地調用它。

+0

雖然編譯器在檢測到擴展類hasn時總能輸出錯誤, t正確地重寫了該方法。我只是想投入這一點,而不是像拖拽類型參數那樣麻煩。 –

相關問題