2017-05-22 18 views
3

這個問題涉及到TypeScript打字問題。錯誤在繼承的靜態類方法

這段代碼

class Foo { 
    static classFoo() { 
    return new this(); 
    } 
} 

class Bar extends Foo { 
    instanceBar() {} 
} 


Bar.classFoo().instanceBar(); 

導致錯誤:

Property 'instanceBar' does not exist on type 'Foo'

當然,這是不正確的,因爲this === BarBar.classFoo()被調用。由於類型錯誤被忽略,由於繼承在ES6類中的工作方式,代碼可以按預期工作。

爲什麼會發生這種情況?這是一個已知的錯誤嗎?這怎麼解決?

回答

2

這是一個known issue,目前的解決辦法是

class Foo { 
    static classFoo<T extends Foo>(this: { new(): T } & typeof Foo): T { 
    return new this(); 
    } 
} 
+0

感謝您的參考。令人遺憾的是,它看起來像泛型是確保其正常工作的唯一方法。 '這個:{new():T}'看起來很整潔,但可能會造成麻煩,可能將它移到IFoo會更好。 – estus

+0

事實上,它太嚴格了,你不能在'classFoo()'中使用任何其他靜態'Foo'方法。但是將其鍵入爲'this:{new():T}&typeof Foo'應該可以解決這個問題,我更新了答案。我不認爲它太寬泛 - 基本上它說「任何擴展'Foo'的'T','classFoo()'返回'T'」。 – artem

+0

是的,它看起來很穩固。謝謝,畢竟這是''this''的一個很好的用法。 – estus