2016-04-26 9 views
3

のは、私はインターフェイスを持っているとしましょう: Typescriptは「サブセットタイプ」をサポートしていますか?

interface IUser { 
    email: string; 
    id: number; 
    phone: string; 
}; 

は、それから私は、そのタイプの サブセット(または完全試合を)期待する機能を持っています。たぶんそれはオブジェクト全体を渡し、ちょうど {email: "[email protected]"}を渡すようにしました。私は型チェッカーに両方を許可したい。

例:

function updateUser(user: IUser) { 
    // Update a "subset" of user attributes: 
    $http.put("https://stackoverflow.com/users/update", user); 
} 

ん活字体はまだ行動のこの種をサポートしていますか?特にReduxのようなパラダイムでは非常に便利です。明確にするために

、目標は次のとおりです。

  1. はオプションにすべての属性を設定する再書き込みインタフェースと手動を避けてください。
  2. 予期しない属性(スペルミスなど)の割り当てを避けます。
  3. ifステートメントのような命令的論理を避けてください。コンパイル時の型チェックの利点は失われます。

UPDATE:活字体が発行されたら、この問題を解決する必要がありmapped typesのサポートを発表しました。

+0

は、あなたが探しているものPartial' 'ではないでしょうか? –

+0

私は質問をしたとき、彼らは存在しませんでした。私はTSに追加された後、後でリンクを追加しました。 – Rick

答えて

6

活字体は今、一部の種類をサポートしています。

パーシャルタイプを作成するための正しい方法は次のとおりです。

type PartialUser = Partial<IUser>;

1

一部またはすべてのフィールドをオプションフィールドとして宣言できます。

interface IUser { 
    email: string; // not optional 
    id?: number; // optional 
    phone?: string; // optional 
}; 
+0

これは近いですが、私が欲しいものではありません。 IUserの場合、すべてのフィールドは必須です。それは私がそれが部分一致であることを望む特定の状況のちょうど下にあります。 – Rick

+0

の要件は矛盾しているため、フィールドはオプションで必須ではありません。 :P私はあなたがそれを得るために2つのインターフェースを使うことができると思います.. – toskv

+1

このような他の言語(フローのような)がそれを可能にしたいと思うことが何度もあります。 DRY性のために、特定の状況下でサブセットを許可したいと考えています。モデルの属性のサブセットでなければならない名前付きパラメータがあるバックボーンモデルの更新について考えてみましょう。 – Rick

1

あなたは異なるインターフェイスにそれを区切ることができます。

interface IUser { 
    id: number; 
}; 

interface IUserEmail extends IUser { 
    email: string; 
} 

interface IUserPhone extends IUser { 
    phone: string; 
} 

はあなたの方法は、ベースIUserインターフェースを受信し、必要なフィールドをチェックしまし:

function doit(user: IUser) { 
    if (user.email) { 

    } else if (user.phone) { 

    } 
} 
1

た場合、私はこの質問を正しく理解してください。フローのようなものが必要です$Shape

ので、一つの場所に、あなたは次にタイプ

interface IUser { 
    email: string; 
    id: number; 
    phone: string; 
}; 

を必要と何か、別の場所で、あなたが今、オプションのすべてのフィールドを持つたIUserと同じ型を持つタイプが欲しいを有することができます。

interface IUserOptional { 
    email?: string; 
    id?: number; 
    phone?: string; 
}; 

あなたは再び種類を記述することなく、IUserに基づいてIUserOptionalを自動生成する方法をしたいです。

今、これはTypescriptでは可能ではないと思います。 2.0では事が変わるかもしれませんが、Typescriptではまだこれに近いとは思えません。

あなたはtypescriptが実行される前にそのようなコードを生成するプリコンパイラを見ることができますが、これは簡単なことではありません。

この問題を念頭に置いて、私はあなたにフローを試すことを推奨します。フローでは、$Shape<IUser>を使用して、プログラムで必要な型を生成できます。もちろん、FlowはTypescriptとは大きく異なりますので、その点を念頭に置いてください。フローは、あなたが列挙型とクラス実装interfactes

のようなものを得ることはありませんので、コンパイラではありません
0

適切なマッピングされたタイプのソリューション:

updateUser<K extends keyof IUser>(userData: {[P in K]: IUser[P]}) { 
    ... 
}