2017-04-27 6 views
6

のは、私が定義した型に付着入力があると仮定してみましょう:のタプル型のマップされた型をどのように生成できますか?

function acceptsPersonProperties(tuple: Array<PersonTuple>) { ... } 

// this should be fine: 
acceptsPersonProperties([['name', 'Bob'], ['age', 42]]); 

// this should give a compile-time error: 
acceptsPersonProperties([['name', 2], ['age', 'Bob']]); 

:今

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

を、私は関数は、キーと値のペアの配列、例えばを受け入れるようにしたいですもちろん、私は、これを手動で入力することができます。例:

type PersonTuple = ['name', string] | ['age', number]; 

しかしタイプ(例えば、Person)TEMPLがある場合どのようにタプルをmapped typeとして表現することができますか?

function acceptsPropertiesOfT<T>(tuple: Array<MappedTypeHere<T>>) { ... } 

XY-問題を回避するために、実際のユースケースはこれです:

"/api/folder/1/files?fileid=23&fileid=47&fileid=69"に解決されますが、私が入力したいので、それは余分な性質を許可していません
let request = api.get({ 
    url: 'folder/1/files', 
    query: [ 
     ['fileid', 23], 
     ['fileid', 47], 
     ['fileid', 69] 
    ] 
}); 

file_id)、タイプをチェックします(文字列はfileid)。

答えて

4

タプルタイプではできません。タプルの右辺は常にPersonのすべての可能な値の和集合に一般化されます。

ただし、あなたが少しあなたのAPIを変更した場合、それを動作させることができます:あなたの答えのための

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

function acceptsPersonProperties(tuple: Partial<Person>[]) { } 

// this should be fine: 
acceptsPersonProperties([{ name: 'Bob' }, { age: 42 }]); 

// this should give a compile-time error: 
acceptsPersonProperties([{ name: 2 }, { age: 'Bob' }]); 
+0

感謝を!私は "現実の"シナリオを含むように私の質問を更新しました。タプルでは(まだ)可能ではないことが悲しいです:/ APIは私のものではないので、TypeScriptのコンプライアンスのためにそれを変更するのは面倒なようです。 –

+0

私はその質問を理解しているか分からない。あなたはこのようなものの後にいますか(マップされたタイプは必要ありません) - https://gist.github.com/bcherny/d70434e5bb53bb88dda29f900d385bbf – bcherny

関連する問題