2017-04-13 8 views
3

インターフェイスで宣言されているプロパティのタイプを変更することはできますか?私は言葉でこれを説明する方法を知らないので、ここでは私がしようとしている単純な例がうまくいかない:TypeScript宣言のマージ - プロパティタイプの変更

Movie名前空間は、

私のアプリケーションでは、私のキャラクターがスーパーの友達と一緒にスーパーになるようにします。だから、私は自分のタイピングでこれを実行しようとしました:活字体は私がSuperCharacterfriendプロパティタイプを上書きすることはできませんので、定義によってSuperCharacterがあるにもかかわらず、しかし動作しません

declare namespace Movie { 
    interface Character { 
    doAnExtraThing(): Promise<void>; // OK to add a new method 
    nickname: string;    // OK to add a new property 
    friend: SuperCharacter;   // NOT OK to override type with a subtype 
    } 

    interface SuperCharacter extends Character { 
    doSomethingSuper(): Promise<void>; 
    } 
} 

a Character。活字体は、このエラーで文句を言う:

[ts] Subsequent variable declarations must have the same type. Variable 
'friend' must be of type 'Character', but here has type 'SuperCharacter'. 

私はSuperCharacterを持っていることによって、私はこの問題を持っていないだろうが、私は、元Characterインタフェースを拡張することを期待していました。

私が達成しようとしていることは間違いないでしょう。それを行う方法はありますか?

答えて

0

friendは、SuperCharacterがすでにCharacterであるため、SuperCharacterになることを明示的に指定する理由はありません。

だから、完全にこのブロックを削除することができます

インタフェースキャラクター{ 友人:SuperCharacter。 }

証拠として、私たちは離れてのインターフェイスからのステップと、正しくコンパイルされたクラスで実装を見ることができます。

class Character { 
    friend?: Character 

    constructor(friend?: Character) { 
    this.friend = friend 
    } 

    doSomething() {} 
} 

class SuperCharacter extends Character { 
    doSomethingSuper() {} 
} 


new Character(new Character()) 
new Character(new SuperCharacter()) 
new SuperCharacter(new Character()) 
new SuperCharacter(new SuperCharacter()) 
+0

残念ながら、これは私のユースケースでは動作しません。私は元の投稿で言ったように、_私のキャラクターがSuper friends_でスーパーキャラクターになりたいのです。つまり、 'const character = new Character()'、 'character.doSomethingSuper()'または 'character ' friend.doSomethingSuper() ' – Merott

+0

そのような状況では、 'const character = new SuperCharacter()'で始まるスーパーキャラクターをインスタンス化する必要があります。 'doSomethingSuper()'のような子クラスのメソッドは、親には決して現れません! – fny

+0

インスタンスの作成方法を制御できません。私の質問は、具体的にどのように宣言のマージを介して既存のインターフェイス上のプロパティのタイプを新しい***互換性のある***型(サブタイプの場合のように)に変更するかについてです。インターフェイスに新しいプロパティを追加することは可能ですが、新しいタイプが元のタイプと互換性がある場合でも、プロパティのタイプを変更することはできないようです。 – Merott

関連する問題