2017-10-01 15 views
0

Iは、次のシグネチャを持つメソッドをproduce有する:typescript内の別のオブジェクトと同じキーを持つオブジェクト?

interface ProduceConditions { 
    [key: string]: Function|Promise<any>; 
} 

produce(conditions: ProduceConditions, input: any): Promise<object>|object; 

ものが返さ(分解)の目的は、conditionsオブジェクトと同じキーを有することです。


編集:私は私はあなたが正しく求めているものを理解していれば、あなたの入力conditionsが持つProduceConditionsの実装となりますhttps://github.com/selfrefactor/rambdax/blob/master/modules/produce.js

+0

「keyof」はgoogleをご覧ください。 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html –

+0

チップのための@トーラザブローありがとうございます。私はそれを徹底的に調べます。 –

答えて

2

に位置して関数のソースへの参照を追加している必要がありますいくつかのキーのセット、および戻り値(約束に包まれているかどうかにかかわらず)は同じキーを持ちますが、値はすべて解決されます。

、あなたが探している署名はのようになり、その場合には

:私はその入力タイプ要件で、入力と出力を表現するために2つのジェネリック型を使用しました。ここ

produce<T extends ProduceConditions, U extends { [key in keyof T]: any }>(conditions: T, input: any): Promise<U> | U 

TProduceConditionsの定義を満たし、出力タイプUTと同じキーを持ちます。

+0

ありがとうございました!これはまさに私が探していたものです。よい日曜日を。 –

+0

私はあなたが戻り値がその署名を与えられた汎用であることを想像することはできません。呼び出し側は、 'T'と' U'の型を選択します(または、呼び出し側でTypeScriptを推論します)。実装は 'U 'を返すことをどのように保証できますか?例: '' <{ dog:() => string '、{cat:number、dog:boolean}>(...) '? – jcalz

+0

@jcalz私は彼らが特定の入力と出力の型を持っていると思っていましたが、正しいかもしれません。その場合は、出力のUsをTベースの定義に置き換えるだけです。 – jonrsharpe

1

入力は、値が関数や約束であり、出力は解決したものと呼ばれる機能や約束を持つオブジェクトであるオブジェクトことになっている場合は、あなたがその制約を指定するmapped typesinference from mapped typesを使用することができます。

type ProduceConditionsMapper<T> = { 
    [K in keyof T]: ((input: T[K]) => void) | Promise<T[K]>; 
} 

declare function produce<T>(conditions: ProduceConditionsMapper<T>, input: any): T; 
アクションで

declare const func: (x: number) => void;  
declare const prom: Promise<string>; 
const produceConditions = { 
    cat: func, 
    dog: prom 
} 

const ret = produce(produceConditions, 'hmm'); 
// inferred as {cat: number; dog: string;} 

は、私がinputおよび他のタイプとの間の関係が何であるかわからないんだけど、それはあなたがそれを以上の特定のタイプを与えることができる可能性がありますの方がより良い結果が得られます。とにかく、助けてくれる希望。

+0

@jcalzさんにありがとうございました。 Typescriptの文脈のように、あなたの例を完全に理解するまでには時間がかかります。私は 'noob'です。 'input'型に関しては、' input'は私の可能な型についての知識がないからです。 –

関連する問題