2017-03-26 16 views
3

私はIUserを使用してdataのサブセットと、このインターフェイスを使用してオブジェクトのサブセットを取る方法は?

let user = subset<IUser>(data); 
// user is now { name: "John", age: 25 } 
// can safely insert user in the db 
よう isAdminプロパティを削除したい私は、このクラスおよびインタフェース

class User { 
    name: string; 
    age: number; 
    isAdmin: boolean; 
} 

interface IUser { 
    name: string; 
    age: number; 
} 

を持っている。そして、私はどこか

const data = { 
    name: "John", 
    age: 25, 
    isAdmin: true 
} 

からこのJSONオブジェクトを取得すると仮定

私の質問は、どのようにTypeScriptでその機能を実装するのですか? typescriptですインターフェイスは、(subsetが呼び出されたときです)実行時には存在しないので、あなたがIUserインタフェースを使用することはできません

function subset(obj: IUser) { 
    return { 
     name: obj.name, 
     age: obj.age 
    } 
} 

:より優れていることを行うための方法はありません

function subset<T>(obj: object) { 
    // keep all properties of obj that are in T 
    // keep, all optional properties in T 
    // remove any properties out of T 
} 

答えて

2

どのプロパティが必要か、どのプロパティが必要かを知る。

あなたはコンパイルプロセスを「生き残る」が、ないクラスを使用することができます:あなたが見ることができるように、プロパティはの一部ではない

var IUser = (function() { 
    function IUser() { 
    } 
    return IUser; 
}()); 

class IUser { 
    name: string; 
    age: number; 
} 

はにコンパイルクラスメンバーはインスタンスにのみ追加され、クラスには追加されないため、コンパイルされた出力はクラスでも役に立ちません。

デコレータとメタデータ(more on that here)を使用できますが、これはあなたのシナリオでは過度のように思えます。

より一般的なsubset機能のための別のオプションは次のとおりです。

function subset<T>(obj: T, ...keys: (keyof T)[]) { 
    const result = {} as T; 

    keys.forEach(key => result[key] = obj[key]); 
    return result; 
} 
let user1 = subset(data, "name", "age"); 
let user2 = subset(data, "name", "ag"); // error: Argument of type '"ag"' is not assignable to parameter of type '"name" | "age" | "isAdmin"' 
関連する問題