2017-03-20 13 views
0

私はTypescript 2を使用しており、データベースオブジェクト用の汎用パーサーメソッドを作成しようとしています。私はTypedJSONを使用しており、正しい方法でパラメータを取得できません。私のコードは:私のコードは次のようなエラーがしましたTypescript:正しいユーザー:TS2345: 'T'型の引数は 'new()=> any'型のパラメータに代入できません。

/** 
* Converts a JavaScript Object Notation (JSON) string into an instance of the provided class. 
* @param text A valid JSON string. 
* @param type A class from which an instance is created using the provided JSON string. 
* @param settings Per-use serializer settings. Unspecified keys are assigned from global config. 
*/ 
parse<T>(text: string, type: {new(): T;}, settings?: SerializerSettings): T; 

Error:(125, 30) TS2345:Argument of type 'T' is not assignable to parameter of type 'new() => {}'. 

私は、多くの事を試みたが、右のそれを得ることができない

private static parseToInstance<T>(dbObject: string, model: T): T { 
    try { 
     console.log("parseToInstance()") 
     let a = TypedJSON.stringify(dbObject); 
     return TypedJSON.parse(a, new model, "whatever" 
    } catch (err) { 
     throw new ParseException(err); 
    } 
} 

方法は何かのように期待しています。たぶん誰かが助けることができます。

答えて

2

を使用するとコンストラクタを示す型注釈。

これをサポートするには、parseToInstance機能をいくつか変更する必要があります。まず、model: Tではなく、{new():T}という型に注釈を付けて、それが間違いなくコンストラクタであることを示す必要があります。他の一般的な言語とは異なり、TSジェネリックはクラスを常に記述するとは限らないため、これを指定する必要があります。第二に、それを渡す前にnewをモデルに呼び出すべきではありません。それはコンストラクタ関数を渡す点を元に戻すことでしょう。

private static parseToInstance<T>(dbObject: string, model: {new():T}): T { 
    try { 
     console.log("parseToInstance()") 
     let a = TypedJSON.stringify(dbObject); 
     return TypedJSON.parse(a, model, "whatever"); 
    } catch (err) { 
     throw new ParseException(err); 
    } 
} 

p.s.あなたがパーズを閉じて閉じたパレンを落とした、私はそれを元に戻した。

1

それはおそらくのようなものでなければなりません:

private static parseToInstance<T>(dbObject: string, model: { new(): T }): T { 
    ... 
    return TypedJSON.parse(a, model, "whatever"); 
} 

2つの変更:

  1. それはちょうどmodel
、あなたが new modelを渡すべきではありません { new(): T }だけではなく T
  • です
  • 関連する問題