問題

これは私がしたいことです:

 abstract class AbBase
  static newDerived<T extends typeof AbBase>(this: T) {
    return class A extends this {
      //...
    }
  }
 

基本的には、newDerivedを非抽象実装からのみ呼び出すようにします。

しかし、私はextends thisの部分でこのエラーが発生します: "Type 'T'はコンストラクタ関数型ではありません。 Tが 'new(... args:any [])=> AbBase'型に制約されることを意味しましたか?

しかし、もし私が

   static newDerived<T extends typeof AbBase>(this: new (...args: any[]) => AbstractInstanceType<T>) {
 

"Baseコンストラクタの戻り値の型 'AbstractInstanceType'は、静的に知られているメンバーを持つオブジェクト型のオブジェクト型または交差ではありません。

  ベストアンサー

TAbBaseを返すコンストラクタに制約することができます。これにより、非抽象クラスの要件が解決され、これを継承できるコンパイラが満たされます。

 abstract class AbBase {
    static newDerived<T extends { new (...a: any[]) : Pick<AbBase, keyof AbBase> } >(this: T) {
        return class A extends this {

        }
    }
}

AbBase.newDerived() // error

class Derived extends AbBase {}
Derived.newDerived() // ok 
 

  同じタグがついた質問を見る

typescript