2016-08-21 7 views
1

私はどのようにposプロパティにアクセスするのか分かりません。Typescript複数型のパラメータ

エラーTS2339:プロパティ 'pos'がタイプ '{pos:RoomPosition; } | RoomPosition '

public moveTo(target: RoomPosition | { pos: RoomPosition }, opts?: FindPathOpts): number { 
    .. 
    if (target instanceof RoomPosition && !target.isEqualTo(destination.x, destination.y)) { 
    .. 
    } else if (!target.pos.isEqualTo(destination.x, destination.y)) { 
    .. 
    } 

答えて

0

typescriptですタイプのガードは非常にスマートではありません。
あなたがこれやる場合:

if (target instanceof RoomPosition) { 
    ... 
} else if (!target.pos.isEqualTo(destination.x, destination.y)) { 
    ... 
} 

を次にそれがtarget.pos文句はありませんが、あなたの最初のiftargetの種類以外のことに多くのロジックが含まれているため、コンパイラはそれを推測しません。そのifが失敗した場合は、target{ pos: RoomPosition }になったことを意味します(別の理由で失敗する可能性があります)。
次のtypescript version (2.x)はよりスマートになりますが、あなたのケースではより良いかどうかはわかりません。

どのようにこのようにそれをやっについて:

public moveTo(target: RoomPosition | { pos: RoomPosition }, opts?: FindPathOpts): number { 
    ... 

    if (target instanceof RoomPosition) { 
     if (!target.isEqualTo(destination.x, destination.y)) { 
      ... 
     } 
    } else { 
     if (!target.pos.isEqualTo(destination.x, destination.y)) { 
      ... 
     } 
    } 

    ... 
} 
3

あなたは労働組合の種類を使用する場合、あなたは両方のタイプに共通のみアクセスプロパティをすることができますhttps://www.typescriptlang.org/docs/handbook/advanced-types.html

を参照してください - 彼らは唯一あるとしてプロパティTypescriptは変数に確実に格納されます。

特定のタイプでのみ使用可能な変数にアクセスするには、タイプアサーションを使用する必要があります。たとえば、明示的な型アサーションを使用できます。それ以外の条件は、ターゲットがRoomPositionですが、それは先に等しくなく、そしてそれがで.POSにアクセスし、実行時の問題を引き起こす可能性があってもトリガすることができるようあなたは、あなたのコードビットをも再構築する必要があり

if (target instanceof RoomPosition && !target.isEqualTo(destination.x, destination.y)) { 
    ... 
} else if (<{pos:RoomPosition}>target.pos.isEqualTo(destination.x, destination.y)) { 
    ... 
} 

else節。以下は安全です:

if (target instanceof RoomPosition) { 
    if (!target.isEqualTo(destination.x, destination.y)) { 
     ... 
    } 
} else if (<{pos:RoomPosition}>target.pos.isEqualTo(destination.x, destination.y)) { 
    ... 
} 

また{pos:RoomPosition}を表現するための名前付きの型またはインタフェースを定義する価値があるかもしれません。

同じことを達成する他の構文的方法があります。ユーザー定義の型ガードについては上記のドキュメントを参照してください。また、ユニオン型で作業するためのその他のメカニズムもあります。

+0

問題は、これらの型アサーションがコードを作成できないことです。コードが冗長すぎるため、型ガードが存在します。 –

関連する問題