0

次の点を考慮してください。

function makeOutputArrayBasedOnInputArray<T>(arrayOfStuff: T[]) {
    return arrayOfStuff.map(item => ({ item }));
}

const x = makeOutputArrayBasedOnInputArray([1, 'two']);
const y = x[0] // { item: string | number; }
const z = x[1] // { item: string | number; }

私が望むのは、代わりに型が表面化することです:

const y = x[0] // { item: number; }
const z = x[1] // { item: string; }

したがって、doIt関数が完全にジェネリックで可変長のタプル型を返すと想像してください。関数への入力によって駆動されます。したがって、これも機能します。

const x = makeOutputArrayBasedOnInputArray([7, 'nine', Date]);
const a = x[0] // { item: number; }
const b = x[1] // { item: string; }
const c = x[2] // { item: Date; }

これは可能ですか?inferまたは、およびタプルの限界に達しましたか?

参照: TypeScript の可変長配列タプル? Typescript、タプルを返す一般的な可変個引数ファクトリ関数

@A_blop の回答に基づいて更新します。

こんにちは、あなたの答えに感謝します! 質問には答えますが、呼び出し元が を使用することに依存していas constます。がないとas const、残念ながら機能しません。

これが鍵になるかもしれません。いくつかのコンテキスト: 質問の背後にある質問は、react-query の型定義を改善するために私が提起した PR です: https://github.com/tannerlinsley/react-query/pull/1527/files

現時点での変更は次のようになります。

export function useQueries<
  TQueryFnData = unknown,
  TError = unknown,
  TData = TQueryFnData
>(
  queries: UseQueryOptions<TQueryFnData, TError, TData>[]
): UseQueryResult<TData, TError>[] {
// ...
}

これは素晴らしいことですが、非特定の型推論の問題があります。理想的には、次の動作が必要です。

const result = useQueries([
    { queryKey: key1, queryFn: () => 1 },
    { queryKey: key2, queryFn: () => 'two' },
])
// result[0].data => number | undefined
// result[1].data => string | undefined

しかし、発信者が指定する必要がなければ、as constそれは可能ではないでしょうか?

4

1 に答える 1