2017-05-11 16 views
2

私はTypeScriptを初めて使用しています。TS2511:抽象クラス 'Validator'のインスタンスを作成できません

どのようにこのエラーメッセージが表示されますか?

私は抽象クラスを初期化するつもりはありません。 validatorMapディクショナリでIsEmptyValidatorという具象クラスを初期化しようとしています。

TS2511:抽象クラスのインスタンスを作成することはできませんあなたがこれを行う必要がありますので、あなたの辞書には、インスタンスValidatorそれのクラスを持っていない「バリ」

interface Dictionary<T> { 
    [key: string]: T; 
} 

abstract class Validator { 
    constructor() { 
     console.log("super"); 
    } 
} 

class IsEmptyValidator extends Validator { 
    public validate() {} 

    constructor(){ 
     super(); 
     console.log("isEmpty"); 
    } 
} 

class ValidatorFactory { 
    private validatorMap: Dictionary<Validator> = { 
     "isEmpty": IsEmptyValidator 
    }; 

    constructor() { } 

    public create(validatorType: string) { 
     let validatorToCreate: Validator = new this.validatorMap[validatorType]; 

     return validatorToCreate; 
    } 
} 
+0

お楽しみいただけますhttp://formstate.github.io/ – basarat

答えて

1

type ValidatorConstructor = { 
    new(): Validator; 
} 

class ValidatorFactory { 
    private validatorMap: Dictionary<ValidatorConstructor> = { 
     "isEmpty": IsEmptyValidator 
    }; 

    constructor() {} 

    public create(validatorType: string) { 
     let validatorToCreate: Validator = new this.validatorMap[validatorType](); 

     return validatorToCreate; 
    } 
} 
+0

新しい回答を作成するのではなく、あなたが持っている辞書を保持する必要があります。抽象 'validate()'メソッドを呼び出し、代わりに 'IsEmptyValidator'でオーバーライドしてください。次に、派生した 'Validator'のインスタンスから' validate() 'を呼び出すことができます。 [this gist](https://gist.github.com/mariocatch/cd086fd868625737a86b5c8f6691d86f) – mariocatch

+0

ありがとうございました!私は理解していません "ValidatorConstructor = { new():Validator; }}"しかし、私はそれを見ています。 – hytm

+0

ここで読むことができます:[クラスのインスタンスとインスタンスの違い](https://www.typescriptlang.org/docs/handbook/interfaces.html#difference-between-the-static-and-instance-sides- of-classes) –

関連する問題